用栈实现队列时栈无法存储值的问题排查
栈实现队列的传参错误分析与修复
你的判断完全正确,问题核心就是函数传参方式错误——C语言中默认是值传递,你在enqueue、dequeue、display中直接传递结构体变量,操作的只是原结构体的副本,根本不会修改main函数里初始化的s1和s2,这就导致栈始终无法存储数据,队列操作完全失效。
具体错误点拆解
- enqueue函数:传递
s1的副本后,push(&s1, x)修改的是副本的栈状态,main里的原s1完全没变化,入队操作等于无效。 - dequeue函数:同样传递
s1和s2的副本,把元素从s1副本移到s2副本后,原栈的数据和状态都没改变,下次调用还是空栈,自然无法正确出队。 - display函数:传递
s2的副本,不仅看不到原栈的真实数据,而且原显示逻辑(从0到top遍历)也不符合队列的输出顺序(队列是先进先出,队头对应s2的栈顶)。
修复方案
所有需要修改原栈状态或访问原栈数据的函数,都必须传递结构体指针,而不是结构体值:
1. 修改enqueue函数
void enqueue(struct stack *s1, int x) { push(s1, x); }
main中调用改为:
enqueue(&s1, x);
2. 修改dequeue函数
int dequeue(struct stack *s1, struct stack *s2) { int x = -1; if (isempty(s2)) { if (isempty(s1)) { printf("QUEUE IS EMPTY!!\n"); return x; } else { while (!isempty(s1)) { push(s2, pop(s1)); } } } return pop(s2); }
main中调用改为:
m = dequeue(&s1, &s2);
3. 修改display函数
同时修正显示顺序,保证输出符合队列先进先出的逻辑:
void display(struct stack *s2) { if (isempty(s2)) { printf("QUEUE IS EMPTY!!\n"); return; } // 队列队头是s2的栈顶,从top到0遍历输出正确顺序 for (int i = s2->top; i >= 0; i--) { printf("%d ", s2->s[i]); } printf("\n"); }
main中调用改为:
display(&s2);
修复后逻辑说明
通过传递指针,函数直接操作main中初始化的原栈:
- 入队时直接修改
s1的状态,数据存入原栈; - 出队时如果
s2为空,将s1的所有元素移到s2(此时s2的栈顶就是队列的队头),弹出s2的栈顶元素即为出队元素; - 显示时从
s2的栈顶到栈底遍历,输出队列的正确顺序。
内容的提问来源于stack exchange,提问作者okay123
相关产品推荐
相关产品推荐

