首页 > 解决方案 > IntelliJ 调试器认为我的 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。这是一张图片:

IntelliJ 调试器和输出的图片

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

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

标签: javaintellij-ideastack

解决方案


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

您应该删除iffor用 a 替换它,while(!stack.isEmpty())并且也可能消除newStack

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

推荐阅读