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