我正在尝试使用两个队列为Stacks创建一个简单的代码。我理解这个概念,并且尝试了以下代码来实现此目的。
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
方法出了什么问题,我将不胜感激。
答案 0 :(得分:1)
您的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);
}
请注意,它仍然缺乏对空堆栈的测试。
您遇到了几个问题:
q1 = q2
,从那时起,您只有1个队列。您应该为q2创建一个新的空队列(或为其分配原始q1)。