如何只使用stack实现queue呢?由于stack是现进后出(FILO),而queue是先进先出的(FIFO)。也就是说stack进行了一次反向,进行两次反向就能实现queue的功能,所以可以用两个stack实现queue。
假设两个栈inStack和outStack,且都为空。可以认为onStack提供入队的功能,栈outStack提供出队的功能。下面是入队和出队的具体算法:
(1)如果栈outStack不为空,直接弹出栈outStack顶部的数据;
(2)如果栈outStack为空,则依次弹出栈inStack的数据,放入栈outStack中,再弹出栈outStack顶部的数据;
实现的代码:
/** * 使用两个栈来模拟队列 * * @param <T> * */ public class SimulationQueue<T> { private Stack<T> inStack; private Stack<T> outStack; public SimulationQueue() { inStack = new Stack<T>(); outStack = new Stack<T>(); } /** * 入队 * * @param t */ public void enqueue(T t) { inStack.push(t); } /** * 出队 */ public T dequeue() { T temp = null; if (!outStack.isEmpty()) { temp = outStack.pop(); } else { while (!inStack.isEmpty()) { temp = inStack.pop(); outStack.push(temp); } if (!outStack.isEmpty()) { temp = outStack.pop(); } } return temp; } /** * 队列是否为空 * * @return */ public boolean isEmpty() { return inStack.isEmpty() && outStack.isEmpty(); } /** * 清空队列 */ public void clear() { inStack.clear(); outStack.clear(); } }
测试代码:
public static void main(String[] args) { SimulationQueue<String> queue = new SimulationQueue<String>(); queue.enqueue("a"); queue.enqueue("b"); queue.enqueue("c"); queue.enqueue("d"); while(!queue.isEmpty()){ System.out.println("当前出队元素:"+queue.dequeue()); } }
输出: