我试图在不修改原始堆栈的情况下计算堆栈中所有元素的总和。为此,我将项目从原始项目中弹出,并将其推入新的堆栈中,以便保留未修改的副本。在弹出/推送项目时,我通过查看新堆栈的顶部来添加总和。
这工作正常,但是在测试方法时,我对堆栈大小有一个非常困惑的问题。
这是我的代码:
public static void main(String[] args) {
Stack<Integer> myStack = new Stack<>();
myStack.push(1);
myStack.push(2);
myStack.push(3);
myStack.push(4);
myStack.push(5);
System.out.println("Stack size = " + myStack.size());
System.out.println(stackSum(myStack));
}
private static int stackSum(Stack<Integer> stack) {
int sum = 0;
Stack<Integer> newStack = new Stack<>();
if (!stack.isEmpty()) {
for (int i = 0; i <= stack.size(); i++) {
newStack.push(stack.pop());
sum += newStack.peek();
}
}
return sum;
}
我得到的答案是12而不是15,这是因为IntelliJ认为传递给stackSum()方法的堆栈的长度是4,而不是5。这是一张图片:
SOUT明确表示大小为5,但调试器认为大小为4?!
真的很感谢您帮助我们了解这里的情况。谢谢!
编辑:
private static int stackSum(Stack<Integer> stack) {
int sum = 0;
int n = stack.size();
Stack<Integer> newStack = new Stack<>();
if (!stack.isEmpty()) {
for (int i = 0; i < n; i++) {
newStack.push(stack.pop());
sum += newStack.peek();
}
}
return sum;
}
这符合我的预期。作为规范的一部分,我必须保留堆栈的副本。现在很好,谢谢。
答案 0 :(得分:2)
调试器指出size = 4
是因为您已经执行了stack.pop
调用,从堆栈中删除了一个元素,因此,其大小现在为4。
您应该放下if
和for
并用while(!stack.isEmpty())
代替它,并可能也消除newStack
:
while (!stack.isEmpty()) {
sum += stack.pop();
}