You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用栈实现队列时栈无法存储值的问题排查

栈实现队列的传参错误分析与修复

你的判断完全正确,问题核心就是函数传参方式错误——C语言中默认是值传递,你在enqueue、dequeue、display中直接传递结构体变量,操作的只是原结构体的副本,根本不会修改main函数里初始化的s1和s2,这就导致栈始终无法存储数据,队列操作完全失效。

具体错误点拆解

  1. enqueue函数:传递s1的副本后,push(&s1, x)修改的是副本的栈状态,main里的原s1完全没变化,入队操作等于无效。
  2. dequeue函数:同样传递s1和s2的副本,把元素从s1副本移到s2副本后,原栈的数据和状态都没改变,下次调用还是空栈,自然无法正确出队。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:40:39