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

借助临时栈实现栈升序排序的C代码运行无输出,原因是什么?

代码问题排查结果

核心致命问题

1. else分支while循环逻辑完全错误

你代码中写的while(item_popped <= item_temp || isEmptyStack(&temp) != 1)存在两个低级错误:

  • 逻辑运算符误用:这里应该用&&而非||。你需要的循环触发条件是同时满足:临时栈非空、临时栈栈顶元素大于等于当前弹出的元素,才需要把临时栈的元素弹回原栈。使用||的话只要临时栈非空,不管栈顶元素大小都会一直弹,直到临时栈为空,完全不符合排序逻辑。
  • 条件判断顺序错误:你在判断临时栈是否为空之前就执行了peek(&temp),如果临时栈已经为空,peek会触发未定义行为(比如返回随机值、程序崩溃、死循环),这就是你最终打印栈无输出的核心原因,未定义行为会导致整个程序执行结果完全不可控。

2. 循环内部未做空栈校验就调用peek

循环内每次弹完临时栈的元素后,直接执行item_temp = peek(&temp);,没有先判断临时栈是否为空,同样会触发空栈peek的未定义行为。

修正后的else分支参考代码

else {
    // 先判断栈非空,再比较栈顶元素,避免空栈peek
    while (!isEmptyStack(&temp) && item_popped <= peek(&temp)) {
        push(s, pop(&temp));
    }
    push(&temp, item_popped);
}

修正逻辑说明

临时栈会始终保持栈底到栈顶降序排列,最后把临时栈全部弹回原栈后,原栈就是栈顶到栈底升序的状态,符合你期望的打印输出顺序。

内容的提问来源于stack exchange,提问作者Olivia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:57:04