usando “push” y “pop” en una stack

Tengo una tarea que me pide que llene una stack de variables aleatorias y las saque en un orden FILO. Mientras conseguí que llenara la stack, parece que está saliendo el último elemento y nada más. No estoy seguro de por qué. Cualquier ayuda sería apreciada.

#include  #include  #include  #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 0; j--){ printf("Random chars:%c\n", pop(s, &s_top)); } return 0; } 

Tu empuje debe ser

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

Eso es primer incremento a la siguiente posición vacía y luego insertar. La variable top siempre apunta al elemento superior. Por lo tanto, para empujar, primero incrementar y luego asignar. Para hacer estallar, primero extraiga el valor en la parte superior y luego disminuya.

Nota: la línea anterior se puede stack[++(*top)] = value para stack[++(*top)] = value

En el código actual, en el primer impulso , su código con la stack[*top++] = item , con el incremento posterior intenta asignar el valor al valor actual de *top que es -1 y luego incrementar, lo que es incorrecto.

Con respecto a esta modificación de la rutina de empuje, la rutina pop está bien.

Mezclaré ambas respuestas (una se borró justo ahora):

Tienes que arreglar tanto push como pop

 void push(char stack[],char item,int *top,int max_size){ stack[++(*top)] = item; } char pop(char stack[],int *top){ return stack[(*top)--]; } 

Ahora dará el resultado esperado.

Ver solo push actualizado y push and pop ambos actualizados

Postfix ++ y -- tienen una prioridad más alta que unary * , por lo que para incrementar lo que apunta más top , debe escribir (*top)++ y (*top)-- ; *top++ avanzará el puntero, que no es lo que quieres.

En segundo lugar, el puntero de la stack siempre debe apuntar a la última cosa agregada a la stack, por lo que desea incrementar el puntero de la stack antes de escribir en la stack:

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

El prefijo ++ tiene la misma precedencia que unario * , por lo que en este caso los paréntesis no son estrictamente necesarios; las operaciones se aplican de izquierda a derecha, por lo que ++*top se interpreta como ++(*top) , pero los parámetros ayudan a aclarar las cosas.

Push and pop siempre debe ser el inverso de cada uno; si presionas con ++(*top) , necesitas hacer pop con (*top)-- .