Java 为什么我的堆栈代码中的pop方法不执行?
我正在尝试使用两个队列为堆栈编写一个简单的代码。我理解这个概念,并尝试了以下代码来实现它Java 为什么我的堆栈代码中的pop方法不执行?,java,stack,queue,Java,Stack,Queue,我正在尝试使用两个队列为堆栈编写一个简单的代码。我理解这个概念,并尝试了以下代码来实现它 import java.util.LinkedList; import java.util.Queue; public class StackWithQueues { Queue<Integer> q1 = new LinkedList<Integer>(); Queue<Integer> q2 = new LinkedList<Integer>(); i
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应该返回最后一个推送的元素,而不是第一个。
在第一个pop中设置q1=q2,从这一点开始,您只有1个队列。您应该为q2创建一个新的空队列,或者将原始q1分配给它。
是的,我现在明白了,但是你能检查一下我问题的更新吗?你必须一次问一个问题。不会将你的问题编辑成另一个问题,它会使答案无效。如果您有不同的问题,请分别提问。@talex我理解,但该问题与前一期和前一期问题密切相关,因此发布新问题就像发布重复的.Nop。现在这是一个完全不同的问题。你还安排了一些人来帮助你。如果有人现在读到这个问题,他会把现有的答案写下来,因为他们没有回答这个问题。@talex,如果你这么说,我会问一个新问题,并把它回复到我原来的帖子上。谢谢,欢迎光临。很乐意帮忙。