我只是代表我的指南和一名学生参加了这个代码的演讲:
#include<stdio.h>
struct stack{
int top;
int store[50];
};
void push(int num, struct stack stk)
{
stk.store[stk.top] = num;
stk.top = stk.top + 1;
}
int pop(struct stack stk)
{
int temp = stk.store[stk.top];
stk.store[stk.top - 1] = 0;
stk.top = stk.top - 1;
return temp;
}
int main()
{
int i;
struct stack imp, pl;
imp.top = 0;
for(i = 0; i<8; i++)
{
int choice, val;
printf("Menu:\n\n");
printf("1. Push\n");
printf("2. Pop\n");
printf("3. Exit\n\n");
printf("Please enter the choice:");
scanf("%d", &choice);
switch(choice)
{
case 1:
printf("Please enter the value to be inserted");
scanf("%d", &val);
push(val, imp);
printf("The position:%d\n",imp.top);
break;
case 2:
printf("The poped value is : %d at position:%d\n",pop(imp), imp.top);
break;
case 3:
return 0;
break;
default:
printf("Wrong choice.\n");
}
}
}
top的值始终为零,pop返回的值始终为零。 有人可以指出代码的错误或代码行为背后的原因。
答案 0 :(得分:2)
您的推送操作符假定stk.top
一个条目堆栈的顶部元素。您的pop操作符假定stk.top
是顶层元素。 (排序;它实际上在内部有点不一致。)
我建议您绘制一个图表并手动执行一些操作,逐行执行代码。注意一个一个一个的问题,并在找到它们时修复它们。
[编辑添加:]哦,Sourav Ghosh(在对原始问题的评论中)也提出了一个非常重要的观点:你是通过值而不是指针传递你的堆栈对象,这也是打破一切 - 因为store
和pop
函数中的修改应用于副本,而不是原始版本。我是社区维基这个答案,因为其中一个关键的东西现在来自我以外的人。
答案 1 :(得分:2)
pop函数返回[top]但重置[top - 1]为0。