java—将来的代码会影响早期的状态吗?

knsnq2tg  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(424)

(编辑:请注意twostacksasqueue和arraylist的add()方法不同,因此不会发生递归调用。在使用调试器后,我仍然被卡住,这就是我在这里寻求帮助的原因。)
我正在设计一个作为队列的两个栈的类。当我运行它时,它打印的最后一个数字是预期的6。但是,当我取消注解最后三行代码时,它会打印3行。
在我看来,如果while循环在 transfer() 方法是否被注解掉。它位于print语句之后,那么它如何可能影响输出呢?我错过了什么?我已经将代码简化为最小的可复制示例。

  1. public class TwoStacksAsQueue<T> {
  2. final int stackCapacity;
  3. final Stack<T> stack1;
  4. final Stack<T> stack2;
  5. public TwoStacksAsQueue(int stackCapacity) {
  6. this.stackCapacity = stackCapacity;
  7. stack1 = new Stack<>();
  8. stack2 = new Stack<>();
  9. }
  10. public void add(T something) {
  11. if (stack1.size() + stack2.size() >= stackCapacity * 2)
  12. throw new RuntimeException("Not enough room in either stack; cannot add");
  13. else if (stack1.isEmpty()) {
  14. stack1.push(something);
  15. } else {
  16. int size = stack1.size();
  17. List<T> popped = new ArrayList<>();
  18. while (!stack1.isEmpty()) popped.add(stack1.pop());
  19. stack1.push(something);
  20. for (int i = size - 1; i >= 0; i--) stack1.push(popped.get(i));
  21. if (stack1.size() > stackCapacity) transfer(stack1, stack2);
  22. }
  23. }
  24. private void transfer(Stack<T> from, Stack<T> to) {
  25. List<T> popped = new ArrayList<>();
  26. System.out.println(from.size());
  27. // while (from.size() > stackCapacity) {
  28. // popped.add(from.pop());
  29. // }
  30. }
  31. }

主要方法:

  1. TwoStacksAsQueue<Integer> twoStacksAsQueue = new TwoStacksAsQueue<>(3);
  2. twoStacksAsQueue.add(0);
  3. twoStacksAsQueue.add(1);
  4. twoStacksAsQueue.add(2);
  5. twoStacksAsQueue.add(3);
  6. twoStacksAsQueue.add(4);
  7. twoStacksAsQueue.add(5);
e5njpo68

e5njpo681#

注解掉的代码行在 stackCapacity 超过了。在您的示例中,当您推送第四项时会发生这种情况。您应该将调试工作集中在那里,而不是等到第六项被推送。如果您认为该代码不应该被触发,直到您点击两次 stackCapacity ,你需要重新考虑这一部分。
你的代码很难理解。特别是,我不知道为什么要创建临时 popped 列表而不是使用 stack2 . 似乎你认为你正在将价值观转移到 stack2 ,但你实际上是把它们放在一个临时的 popped 然后超出范围的列表。通过打印出 stack1stack2 而不是试图根据大小来辨别东西。

相关问题