我正在尝试使用两个队列制作一个简单的代码。我了解这个概念,并且我尝试了以下代码来实施此概念。
import java.util.LinkedList;
import java.util.Queue;
public class StackWithQueues {
Queue<Integer> q1 = new LinkedList<Integer>();
Queue<Integer> q2 = new LinkedList<Integer>();
int size;
public StackWithQueues() {
this.size = 0;
}
public void push(int ele) {
q1.add(ele);
size++;
System.out.println("Pushed "+ele);
}
public void pop() {
while(!q1.isEmpty()) {
q2.add(q1.peek());
q2.poll();
}
int popped = q2.peek();
size--;
q1 = q2;
System.out.println("Popped "+popped);
}
public static void main(String[] args) {
StackWithQueues s = new StackWithQueues();
for(int i=0;i<5;i++)
s.push(i+1);
s.pop();
s.pop();
s.pop();
}
}
我不明白为什么pop()
方法什么都没做。控制台在执行时显示以下输出。
推了1
推2
推动3
推动4
推5
如果有人可以在此处解释pop
方法出了问题。
您的pop
方法具有无限环路。它不断将元素添加到q2
中,而无需删除q1
的任何内容(因为q1.peek()
不会删除队列的头部),因此q1
永远不会变为空。
这样的事情似乎有效:
public void pop() {
int popped = 0;
while(!q1.isEmpty()) {
popped = q1.poll ();
if (!q1.isEmpty ()) {
q2.add (popped);
}
}
size--;
Queue<Integer> temp = q1;
q1 = q2;
q2 = temp;
System.out.println("Popped "+popped);
}
请注意,它仍然缺乏空堆栈的测试。
您有几个问题:
- 这是一个堆栈,因此pop应该返回最后一个元素,而不是第一个。
- 在您设置
q1 = q2
的第一个弹出中,从此开始,您只有1个队列。您应该为Q2创建一个新的空排队(或分配给原始Q1)。