【发布时间】:2021-11-20 02:37:01
【问题描述】:
尝试使用堆栈查找输入为 0 的最后一个元素的索引,我使用方法 pop() 和 peek()。
这是我的代码:
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 = "f";
int b = 0;
for (int i = 0; i < a.size(); i++) {
if (a.peek().equalsIgnoreCase(str)){
break;
}
a.pop();
b++;
}
System.out.println(str);
System.out.println(b);
}
}
str = "f" 时的预期输出:
0
是的,当我尝试使用我的解决方案时,它可以正常工作。
直到我尝试使用 str = "b" 预期输出:
[a, b, c, d, e, f]
b
4
实际输出:
[a, b, c, d, e, f]
b
3
同样使用 str = "a", 预期输出:
[a, b, c, d, e, f]
a
5
实际输出:
[a, b, c, d, e, f]
a
3
因此,无论出于何种原因,直到堆栈上的最后两个元素,int b 都没有增加。知道为什么会这样吗?
【问题讨论】:
-
如果你要弹出,为什么还要偷看呢?
-
因为无论出于何种原因,如果您继续查看循环内部的任何原因,它都不会移动到前一个元素上,因此您必须不断弹出以便可以查看前一个元素。至少这就是我尝试时发生的事情,除非我做错了什么
-
@ScaryWombat 询问为什么 peek。 您必须弹出,但 pop 返回的值与 peek 相同,因此您不需要 peek。这里的问题是您从零增加
b,而您应该从a.size()-1减少它。但是堆栈中某物的索引有什么用仍然是一个谜,而当堆栈被修改后,它的用途就更成谜了。实际上你根本不需要b,因为答案总是a.size()-1。 -
@user207421 “但是堆栈中某物的索引有什么用仍然是个谜” 确实,只是我的老师给了学生一个特定的任务,而那个任务特别命令我们使用堆栈。如果它使用任何其他存储元素的方法。我宁愿更多地使用它。它只是围绕堆栈本身工作让我很困惑
-
你可以随时问你的老师他在说什么。给他看这个页面。堆栈只能通过 push 和 pop 访问,而不是通过索引:否则它们将不再是堆栈,而仅仅是数组或列表。