为何使用该for循环遍历Stack时仅输出3和2,无法输出1?
问题原因分析
你的代码逻辑问题出在for循环的执行流程上,我们一步步拆解执行过程:
- 初始状态:栈内元素为
[1,2,3](栈顶是3) - 循环初始化:
num = s.pop()→ 弹出栈顶元素3,栈变为[1,2] - 第一次判断
!s.isEmpty()→ 栈非空,进入循环体输出3 - 迭代步骤:
num = s.pop()→ 弹出元素2,栈变为[1] - 第二次判断
!s.isEmpty()→ 栈非空,进入循环体输出2 - 迭代步骤:
num = s.pop()→ 弹出最后一个元素1,栈变为空栈[] - 第三次判断
!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
相关产品推荐
相关产品推荐

