IntelliJ调试器认为我的Stack实际上比它小一个元素吗?

时间:2018-11-05 22:08:28

标签: java intellij-idea stack

我试图在不修改原始堆栈的情况下计算堆栈中所有元素的总和。为此,我将项目从原始项目中弹出,并将其推入新的堆栈中,以便保留未修改的副本。在弹出/推送项目时,我通过查看新堆栈的顶部来添加总和。

这工作正常,但是在测试方法时,我对堆栈大小有一个非常困惑的问题。

这是我的代码:

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。这是一张图片:

Picture of IntelliJ debugger and output

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;
}

这符合我的预期。作为规范的一部分,我必须保留堆栈的副本。现在很好,谢谢。

1 个答案:

答案 0 :(得分:2)

调试器指出size = 4是因为您已经执行了stack.pop调用,从堆栈中删除了一个元素,因此,其大小现在为4。

您应该放下iffor并用while(!stack.isEmpty())代替它,并可能也消除newStack

while (!stack.isEmpty()) {
    sum += stack.pop();
}