2013-09-12 2 views
7

У меня есть задание, которое просит меня заполнить стек случайными величинами и выскочить в порядке FILO. Пока мне удалось получить его, чтобы заполнить стек, он, кажется, выдает последний элемент и ничего больше. Я не знаю, почему. Любая помощь будет оценена по достоинству.используя «push» и «pop» в стеке

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#define STACK_SIZE 10 
#define STACK_EMPTY -1 
void push(char [], // input/ouput - the stack 
      char, // input - data being pushed onto the stack 
      int *, // input/output - pointer to the index of the top of stack 
      int); // constant - maximum size of stack 
char  // output - data being popped out from the stack 
pop(char [], // input/output - the stack 
    int *); // input/output - pointer to the index of the top of stack 
void push(char stack[],char item,int *top,int max_size){ 
    stack[*top++] =item; 
} 
char pop(char stack[],int *top){ 
    return stack[*top--]; 
} 
int main(){ 
    char s[STACK_SIZE]; 
    int s_top = STACK_EMPTY; // Pointer points to the index of the top of the stack 

    char randChar = ' '; 
    int i = 0; 
    int j=0; 
    int randNum = 0; 

    srand(time(NULL)); 

    for (i = 0; i < STACK_SIZE; i++){ 
     randNum = 33 + (int)(rand() % ((126-33)+ 1)); 
     randChar = (char) randNum; 
     push(s,randChar, &s_top, STACK_SIZE); 

     printf ("Random char: %c\n", randChar); 

    } 
    printf("-----------\n"); 

    for(j=STACK_SIZE; j>0; j--){ 
     printf("Random chars:%c\n", pop(s, &s_top)); 
    } 
    return 0; 
} 
+3

FILO - First In, Last Out. Интригующий! Обычно на английском языке это LIFO - Last In, First Out. Он заканчивается тем же (но называется параллельно с FIFO - First In, First Out). Не большая проблема - просто любопытство. –

ответ

6

Ваш толчок должен быть

(*top)++; 
stack[*top] = value; 

Это первое приращение к следующей пустой позиции, а затем вставить. Переменная top всегда указывает на верхний элемент. Поэтому для толкания сначала присваивается первый приращение. Чтобы поп, сначала извлеките значение сверху и затем уменьшите.

Примечание: Эта строка может избить до stack[++(*top)] = value

В текущем коде, в первого толчка, код с stack[*top++] = item, с последующей приращению пытается присвоить значение к текущему значению *top который равен -1, а затем приращение, что неверно.

Что касается этой модификации push-рутины, процедура pop работает нормально.

+2

Либо 'stack [++ (* top)] = item;' за один шаг –

+1

@GrijeshChauhan: да, это правильно, мы всегда можем клубить это, я просто хотел четко указать шаги. * Редактировать * добавил примечание об этом. – phoxis

+0

, который, похоже, сделал трюк, я благодарю вас за помощь. – walkirie27

0

Я смешивать оба ответы (один был удален только сейчас):

Вы должны установить оба push и pop

void push(char stack[],char item,int *top,int max_size){ 

    stack[++(*top)] = item; 
} 
char pop(char stack[],int *top){ 

    return stack[(*top)--]; 
} 

Будет теперь дают ожидаемый результат

Посмотреть only push updated и push and pop both updated

0

Почтовый адрес ++ и -- ha более высокий приоритет, чем унарный *, поэтому, чтобы увеличить то, что topуказывает на, вам необходимо написать (*top)++ и (*top)--; *top++ будет продвигать указатель, который не то, что вы хотите.

Во-вторых, указатель стека должен всегда указывать на последнюю вещь добавляется в стек, так что вы хотите, чтобы увеличить указатель стека перед тем запись в стек:

stack[++(*top)] = value; 

Prefix ++ имеет одинаковый приоритет как унарные *, поэтому в этом случае скобки не являются строго необходимыми; операции применяются слева направо, поэтому ++*top интерпретируется как ++(*top), но при помощи Parens все разъясняется.

Push и pop всегда должны быть обратными друг другу; если вы нажмете ++(*top), вам нужно попсовать (*top)--.