Реализуйте массив стеков в C - PullRequest
0 голосов
/ 12 ноября 2009

Реализация массива стеков, в которых определены стеки:

typedef struct StackNode {

   int data;

   StackNode* next;

} StackNode;

Каждый элемент массива указывает на стек, каждый стек инициализируется как пустой стек. Когда вы начнете добавлять элементы, они начнут добавлять их в стек в Stacks[0]; если вы скажете -2 в stdin, а затем, например, 4, следующие записи перейдут к Stacks[4];

Например:

5 10 -2 3 9 7 89 -1
will result in :
Stacks[0] -> 10 -> 5
Stacks[1]
Stacks[2]
Stacks[3] -> 89 -> 7 -> 9

-1 остановит выполнение кода.

У меня проблема с реализацией массива стеков, поэтому любая помощь будет принята:)

Ответы [ 6 ]

2 голосов
/ 12 ноября 2009
int t = 0, index = 0;
while(t != -1)
{
  scanf("%d", &t);
  if(t == -2)
  {
    scanf("%d", &t);
    index = t;
    continue;
  }
  if(t >= 0)
    push(stacks[index], t);
}
2 голосов
/ 12 ноября 2009

В строке 3 из

typedef struct StackNode {
   int data;
   StackNode* next;          /* line 3 */
} StackNode;

тип StackNode еще не существует. Тип StackNode начинает существовать только после полного анализа типа struct StackNode.

Но тип struct StackNode уже существует в этой точке. Это все еще не полностью, но вы можете объявить указатели на него.

typedef struct StackNode {
   int data;
   struct StackNode* next;          /* line 3 */
} StackNode;
1 голос
/ 12 ноября 2009

Вы можете попробовать что-то вроде следующего (проверено):

//includes
#define SIZE 10


typedef struct StackNode{
 int data ;
 struct StackNode* next ;
}StackNode ;



StackNode* new_stackNode(int num)
{
 StackNode* ptr = (StackNode*)malloc(sizeof(StackNode)) ;
 ptr->data = num ;
 ptr->next = 0 ;
 return ptr ;
}



int main()
{
 StackNode *arr[SIZE] = {0};
 int st_index = 0 ;
 int num = 0 ;
 while(num != -1)
 {
  scanf("%d",&num);
  if( num == -2 )
  st_index++ ;
  else
  {
   StackNode* ptr = new_stackNode(num) ;
   ptr->next = arr[st_index] ;
   arr[st_index] = ptr ;
  }
 }
}
0 голосов
/ 12 ноября 2009

Сначала вы должны получить массив StackNode s:

StackNode ** stacks = malloc(sizeof(StackNode*) * 5); /* allocate 5 stack nodes */
stacks[0] = malloc(sizeof(StackNode)); /* allocate first stack */
...

Теперь у вас есть функция push(StackNode *, int value). Для добавления определенного стека вызовите его с помощью push(stacks[2], value) (например, для добавления третьего стека).

0 голосов
/ 12 ноября 2009

Если вы перейдете к концу этой статьи в Википедии , вы увидите пример того, что я думаю вы пытаетесь реализовать. То, что у вас есть, это связанный список. Кроме того, вот несколько удобных помощников по двусвязному списку , которые могут служить примером.

Если вы опубликуете фактическое использование кода как есть, вы можете получить более точный (более конкретный) ответ.

0 голосов
/ 12 ноября 2009

Это не похоже на стек, это похоже на связанный список. Конечно, вы можете реализовать стековую семантику, используя связанный список, но обычно это не то, что подразумевается под «стеком».

Чтобы ввести новый номер, вам необходимо:

  • Выделите новый StackNode.
  • Инициализируйте его новым номером.
  • Ссылка на предыдущую.

Вы можете заключить это в функцию:

void stack_push(StackNode *root, int value)
{
    /* Code omitted */
}

Тогда вам нужно просто предоставить правильный стек, чтобы контролировать, на какой из множества ваших стеков выложить новый номер:

stack_push(&Stacks[2], 4711);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...