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

为何使用该for循环遍历Stack时仅输出3和2,无法输出1?

问题原因分析

你的代码逻辑问题出在for循环的执行流程上,我们一步步拆解执行过程:

  1. 初始状态:栈内元素为[1,2,3](栈顶是3)
  2. 循环初始化:num = s.pop() → 弹出栈顶元素3,栈变为[1,2]
  3. 第一次判断!s.isEmpty() → 栈非空,进入循环体输出3
  4. 迭代步骤:num = s.pop() → 弹出元素2,栈变为[1]
  5. 第二次判断!s.isEmpty() → 栈非空,进入循环体输出2
  6. 迭代步骤:num = s.pop() → 弹出最后一个元素1,栈变为空栈[]
  7. 第三次判断!s.isEmpty() → 栈为空,循环直接终止,此时已经弹出的1没有机会进入循环体被输出

核心问题:for循环的判断条件在迭代步骤之后、循环体执行之前,当弹出最后一个元素时栈已为空,判断不通过,循环体(输出操作)无法执行。

修复方案

方案1:保留弹出元素逻辑(会清空原栈)

改用do-while循环,先执行输出再判断栈是否为空,确保最后一个元素能被输出:

public class Main {
    public static void main(String[] args) {
        Stack<Integer> s = new Stack<>();
        s.add(1);
        s.add(2);
        s.add(3);

        if (!s.isEmpty()) {
            Integer num;
            do {
                num = s.pop();
                System.out.println(num);
            } while (!s.isEmpty());
        }
    }
}

方案2:遍历但保留原栈元素

如果不需要修改原栈,可使用增强for循环或迭代器(遍历顺序为栈底到栈顶,输出1、2、3):

// 增强for循环
for (Integer num : s) {
    System.out.println(num);
}

// 迭代器实现
Iterator<Integer> it = s.iterator();
while (it.hasNext()) {
    System.out.println(it.next());
}

方案3:栈顶到栈底遍历且保留原栈

先复制原栈,再对副本执行弹出操作:

Stack<Integer> temp = new Stack<>();
temp.addAll(s);
while (!temp.isEmpty()) {
    System.out.println(temp.pop());
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 09:15:33