借助临时栈实现栈升序排序的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
相关产品推荐
相关产品推荐

