El problema es que no puedo usar la función pop.
int pop(int stack[],int *top,int item) { if(*top==-1) { printf("Stack Underflow"); return 0; } return stack[(*top)--]; } Aquí, si uso stack[*top--] parece que no funciona! ¿Cuál es la diferencia? ¿Por qué la variable superior en la función principal no se reduce?
int main() { int stack[4], top = -1, item, id, ch; for(;;) { printf("Enter your choice:\n1.push\n2.pop\n3.Print top element\n4.Print all elements\n5.Exit\n"); scanf("%d",&ch); switch(ch) { case 1: printf("Enter the item to be pushed:\n"); scanf("%d",&item); push(stack,&top,item); break; case 2: id=pop(stack,&top,item); printf("%d was popped\n",id); break; case 4: print(stack,&top,item); break; case 5: exit(0); } } }Lo que (*top)-- hace es:
top , es decir, accede al valor al que apunta top . Lo que hace *top-- es:
top , es decir, el valor de top mismoAdemás de eso, creo que sería mejor si define una estructura de pila en lugar de usar una matriz sin procesar y un número entero como puntero.
#define STACK_CAPACITY 3 // Adjust it as you want struct stack { int items[STACK_CAPACITY]; int top; }; void stack_init(struct stack *s) { s->top = -1; } int stack_push(struct stack *s, int item) { if (s->top == STACK_CAPACITY-1) return 0; // fail: stack is full s->items[++s->top] = item; return 1; // success: item pushed } int stack_pop(struct stack *s, int *top) { if (s->top == -1) return 0; if (top != NULL) // if top is NULL, ignore it *top = s->items[s->top]; s->top--; return 1; }Así es como puedes usarlo:
int main() { struct stack s; stack_init(&s); if (!stack_push(&s, 1)) printf("Stack is full\n"); if (!stack_push(&s, 2)) printf("Stack is full\n"); if (!stack_push(&s, 3)) printf("Stack is full\n"); if (!stack_push(&s, 4)) printf("Stack is full\n"); if (!stack_push(&s, 5)) printf("Stack is full\n"); int item; stack_pop(&s, &item); printf("top = %d\n", item); // outputs 3 stack_pop(&s, NULL); // Ignore the top stack_pop(&s, &item); printf("top = %d\n", item); // outputs 1 if (!stack_pop(&s, NULL)) { printf("Stack is empty: cannot pop\n"); } } Además, no use scanf() para leer la entrada del usuario. fgets() es mucho más seguro.
En C, todos los operadores de posfijos tienen mayor precedencia que todos los operadores de prefijos (o infijos). Así es como se define el lenguaje. Asi que
*top--es equivalente a
*(top--)y si tu quieres
(*top)--necesitas el paréntesis explícito.
return stack[(*top)--];
here if I use [*top--]
(*top)-- obtiene el objeto al que apunta la top y lo decrementa. Debido a que *top apunta a la parte top de la persona que llama, ese es el valor que desea usar para buscar un elemento de matriz. Luego -- disminuye el top de la persona que llama, haciendo que apunte al siguiente elemento más reciente en la pila.
*top-- es *(top--) , que decrementa top y obtiene el objeto al que apunta el valor no decrementado. Eso también obtiene la top de la persona que llama, pero disminuye la parte top local de la función, no el objeto de la persona que llama. Debido a que la top de la función se reduce, ya no apunta a la top de la persona que llama.