【发布时间】:2021-11-17 22:25:11
【问题描述】:
问题是我无法使用弹出功能。
int pop(int stack[],int *top,int item)
{
if(*top==-1) {
printf("Stack Underflow");
return 0;
}
return stack[(*top)--];
}
在这里,如果我使用stack[*top--],它似乎不起作用!有什么区别?为什么 main 函数中的 top 变量没有递减?
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);
}
}
}
【问题讨论】:
-
您刚刚了解了为什么将三个操作塞进大约 10 个字符的代码中是一个非常糟糕的主意。您的大脑实际上无法同时处理超过 3 到 5 个状态的复杂性,您只需将三个操作放入 10 个字符中,这些字符也位于执行函数返回语句的行上。如果有人教你写这样的代码,我敢打赌,他们从来没有待过电话,等到凌晨从家里接到电话,只是为了紧急修复这种过于复杂的代码会造成错误。
-
这里的另一课是关于数据类型的良好封装。这些
push和pop函数具有糟糕的宽接口,要求调用者同时传递堆栈和堆栈指针,这意味着堆栈指针必须通过引用传递,以便函数可以修改它。相反,如果有适当的堆栈数据类型,某种struct stack,并且如果传递了指向该结构的指针,事情就会变得更简单、更清晰。 (当然,在 Chiranjit Debnath 所学课程的这个阶段,可能还没有引入结构。) -
@AndrewHenle 许多平庸的 C 教师似乎是一个几乎神秘的永恒链条的一部分,将他们自己被误导的教师教给他们的不幸的学生传授给他们同样被误导的课程,他们从他们的在他们面前被误导的导师。这些被误导的教师都没有资格进行“真正的”编程,或者向学生教授“真正的”编程;充其量他们可以教育下一批被误导的教师,并且循环继续......
标签: c function switch-statement stack underflow