Java使用Stack的pop、peek方法查找元素索引计数异常问题排查
问题原因
你的bug根源是for循环的判断条件使用了动态变化的栈长度a.size(),同时循环变量i还在持续递增,二者共同作用导致循环提前终止,根本没有遍历到栈底部的元素。
我们以查找str = "b"的场景为例一步步拆解执行过程:
初始状态:栈内元素为[a, b, c, d, e, f],栈长度=6,i=0,计数b=0
- 第1次循环:
i=0 < 6成立,栈顶是f≠b,弹出f,b=1,栈长度变为5,i自增为1 - 第2次循环:
i=1 <5成立,栈顶是e≠b,弹出e,b=2,栈长度变为4,i自增为2 - 第3次循环:
i=2 <4成立,栈顶是d≠b,弹出d,b=3,栈长度变为3,i自增为3 - 第4次循环判断:
i=3 < 3不成立,循环直接终止。此时栈顶是c,还没有遍历到b和a,自然不会得到正确的计数结果。
查找a时的问题同理,循环提前终止,计数停在了3,不会继续遍历剩余元素。
修复方案
把for循环替换为while循环,只要栈不为空就持续判断即可,不需要额外的循环变量i:
public class Main { public static void main(String[] args) { Stack<String> a = new Stack<>(); a.push("a"); a.push("b"); a.push("c"); a.push("d"); a.push("e"); a.push("f"); System.out.println(a); String str = "a"; int index = 0; // 替换为while循环,只要栈不为空就继续判断 while (!a.isEmpty()) { if (a.peek().equalsIgnoreCase(str)){ break; } a.pop(); index++; } System.out.println(str); System.out.println(index); } }
修改后即可得到符合预期的输出结果。
内容的提问来源于stack exchange,提问作者Audrey
相关产品推荐
相关产品推荐

