为什么我的堆栈代码中的POP方法不会执行



我正在尝试使用两个队列制作一个简单的代码。我了解这个概念,并且我尝试了以下代码来实施此概念。

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);
}

请注意,它仍然缺乏空堆栈的测试。

您有几个问题:

  1. 这是一个堆栈,因此pop应该返回最后一个元素,而不是第一个。
  2. 在您设置q1 = q2的第一个弹出中,从此开始,您只有1个队列。您应该为Q2创建一个新的空排队(或分配给原始Q1)。

最新更新