为什么我的堆栈代码中的pop方法无法执行?

时间:2018-12-20 07:21:07

标签: java stack queue

我正在尝试使用两个队列为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方法出了什么问题,我将不胜感激。

1 个答案:

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

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

您遇到了几个问题:

  1. 这是一个堆栈,因此pop应该返回被压入的最后一个元素,而不是第一个。
  2. 在第一个弹出窗口中,设置q1 = q2,从那时起,您只有1个队列。您应该为q2创建一个新的空队列(或为其分配原始q1)。