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)--
.