Я пытаюсь вычислить сумму всех элементов в стеке без изменения исходного стека. Для этого я вытаскиваю элементы из оригинала и помещаю их в новую стопку, чтобы сохранить неизмененную копию. По мере того, как элементы выталкиваются / выталкиваются, я добавляю суммы, заглядывая в верхнюю часть нового стека.
Это работает нормально, но у меня очень запутанная проблема с размером стека при тестировании метода.
Вот мой код:
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?!
Был бы очень признателен за помощь в понимании того, что здесь происходит. Спасибо!
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;
}
Это работает так, как я ожидал. Я должен был сохранить копию стека как часть спецификации. Теперь все хорошо, спасибо.