Отладчик IntelliJ считает, что мой стек на один элемент меньше, чем он есть? - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь вычислить сумму всех элементов в стеке без изменения исходного стека. Для этого я вытаскиваю элементы из оригинала и помещаю их в новую стопку, чтобы сохранить неизмененную копию. По мере того, как элементы выталкиваются / выталкиваются, я добавляю суммы, заглядывая в верхнюю часть нового стека.

Это работает нормально, но у меня очень запутанная проблема с размером стека при тестировании метода.

Вот мой код:

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?!

Был бы очень признателен за помощь в понимании того, что здесь происходит. Спасибо!

EDIT:

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 голосов
/ 06 ноября 2018

Отладчик сообщает size = 4, потому что вы уже выполнили вызов stack.pop, удаляя один элемент из стека, поэтому его размер теперь равен 4.

Вы должны удалить if и for и заменить его на while(!stack.isEmpty()) вместо этого и, вероятно, также исключить newStack:

while (!stack.isEmpty()) {
    sum += stack.pop();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...