Имея много стеков с разными типами - PullRequest
1 голос
/ 13 ноября 2009

Я делаю программу на C, которая должна использовать два стека. Один должен держать символы, другой - двойники. У меня есть две структуры, узел и стек:

struct node {
    double value;
    struct node *next;
    struct node *prev;
};

struct stack {
    struct node *last;
    struct node *curr;
};

Проблема в том, что мне нужен один из каждого типа. Единственное, о чем я могу думать, - это две отдельные структуры (то есть char_node, double_node, char_stack, double_stack) Если бы это был C ++, я бы использовал шаблоны, но, конечно, я не могу в C.

Одна вещь, которую я помню, которую можно использовать для этого, - указатель на пустоту. Будет ли это работать, и будет ли это практичным?

Ответы [ 5 ]

5 голосов
/ 13 ноября 2009

Вы можете использовать союз.

Здесь немного информации о союзах .

3 голосов
/ 13 ноября 2009
  1. Если вы действительно хотите использовать связанный список в качестве стека , вам не нужно использовать next и prev, просто следующее. Также вам не нужен указатель хвоста / головы (последний в коде примера). В стеке вы всегда заботитесь только о верхнем элементе.

  2. Если вы реализуете стек для хранения типов, таких как char и double, почему бы не объявить массив каждого типа и не сохранить указатель на последний действительный элемент в массиве? Затем, когда вы хотите нажать на массив, вы увеличиваете указатель и устанавливаете значение. Для всплытия вы делаете наоборот: получите значение и уменьшите указатель. Использование массива означает выделение всей памяти, которая вам может понадобиться, одним махом, а не каждый раз, когда вы хотите поместить новый узел в стек.

2 голосов
/ 13 ноября 2009

Почему бы не использовать союз?

struct node {
    union {
       double d_value;
       char c_value;
    } val;
    struct node *next;
    struct node *prev;
};
1 голос
/ 13 ноября 2009

Если каждый стек должен содержать только один тип данных, объединения и указатели void являются излишними. Создайте DoubleStackNode и CharStackNode - это то, что шаблон C ++ (т.е. StackNode<T>) все равно будет делать за кулисами.

Не убивайте себя, пытаясь найти какое-то супер-общее универсальное решение. Вам нужно только два типа стеков.

Вы могли бы использовать объединение, но это добавило бы значительную часть пространства в ваш стек символов.

1 голос
/ 13 ноября 2009

ОК, но показанная вами структура узла, кажется, принадлежит двойному связанному списку, а не стеку. Вы действительно думаете о укладке? Цепочки связанных узлов, которые, как вы показываете, выделяются динамически, мгновенно пожирают вашу память.

Я бы порекомендовал вам пересмотреть базовый дизайн этого. Вы должны использовать память более эффективно (возможно, я ничего не знаю о ваших особых условиях, но это общий подход. Это действительно может привести к 2 отдельным стекам для объектов другого типа, чтобы сохранить выравнивание данных (вам не понравятся 1-байтовые символы) смешивается с 4 байтами, например, в простой области памяти).

Но это только мое мнение, основанное на моем опыте с этим, может быть, это полезно в вашей ситуации;).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...