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,如果你这么说,我会问一个新问题,并把它回复到我原来的帖子上。谢谢,欢迎光临。很乐意帮忙。