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

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

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

public class TwoStacksAsQueue<T> {
    final int stackCapacity;
    final Stack<T> stack1;
    final Stack<T> stack2;

    public TwoStacksAsQueue(int stackCapacity) {
        this.stackCapacity = stackCapacity;
        stack1 = new Stack<>();
        stack2 = new Stack<>();
    }

    public void add(T something) {
        if (stack1.size() + stack2.size() >= stackCapacity * 2)
            throw new RuntimeException("Not enough room in either stack; cannot add");
        else if (stack1.isEmpty()) {
            stack1.push(something);
        } else {
            int size = stack1.size();
            List<T> popped = new ArrayList<>();
            while (!stack1.isEmpty()) popped.add(stack1.pop());
            stack1.push(something);
            for (int i = size - 1; i >= 0; i--) stack1.push(popped.get(i));
            if (stack1.size() > stackCapacity) transfer(stack1, stack2);
        }
    }

    private void transfer(Stack<T> from, Stack<T> to) {
        List<T> popped = new ArrayList<>();
        System.out.println(from.size());
//        while (from.size() > stackCapacity) {
//            popped.add(from.pop());
//        }
    }
}

主要方法:

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

e5njpo681#

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

相关问题