每天写一点代码----双队列实现栈

来源:互联网 发布:mysql查询root密码 编辑:程序博客网 时间:2024/05/19 20:21

问题描述:

用两个队列模拟堆栈的操作(入栈与出栈)

思路:

我们知道队列是FIFO(先进先出),而栈是后进先出(LIFO)

要用两个队列实现堆栈我们可以这样做:

假设有A.B两个队列,开始都为空。那么:

入栈操作:

1,当A,B队列均为空时,直接将元素进入A队列。

2,当A,B队列有一个不为空时,将元素入队到不为空的那个队列中。

出栈操作:

1,当A,B 队列均为空时,出栈为Null。

2,当A,B队列有一个不为空时,将不为空的队列(假设为队列B)中的前N-1个元素依次入队到另一个队列(队列A)中,

再将B队列中剩下的最后的一个元素出队并返回之。


Java实现:

import java.util.LinkedList;import java.util.Queue;/** * 双队列实现栈 *  * @author likebamboo * @create 2013-10-21 * @param <E> */public class MyStack<E> {    /**     * 队列A     */    private Queue<E> qA;    /**     * 队列B     */    private Queue<E> qB;    public MyStack() {        super();        qA = new LinkedList<E>();        qB = new LinkedList<E>();    }    /**     * 入栈操作     *      * @param item     */    public void push(E item) {        // 如果B队列不为空,将元素入B队列        if (!qB.isEmpty()) {            qB.offer(item);            return;        }        // 如果两个队列均为空,或者A队列不为空,均将原始加入A队列        qA.offer(item);    }    /**     * 出栈操作     *      * @return     */    public E pop() {        // 如果队列B不为空,那么将B队列中的前N-1个元素出队并进入A队。        // 并将B队列中的最后一个元素出队列并返回。        if (!qB.isEmpty()) {            while (qB.size() > 1) {                qA.offer(qB.poll());            }            return qB.poll();        }        // 如果队列B为空,那么不管A队列是否为空(为空时抛出异常也是合理的).        // 将A队列中前N-1个元素出队并进入A队列。再返回A队列中的最后一个元素。        while (qA.size() > 1) {            qB.offer(qA.poll());        }        return qA.poll();    }    /**     * 栈是否为空     *      * @return     */    public boolean isEmpty() {        return qA.isEmpty() && qB.isEmpty();    }    public static void main(String[] args) {        MyStack<String> stack = new MyStack<String>();        stack.push("first");        System.out.println(stack.pop());        stack.push("second");        stack.push("third");        stack.push("fourth");        stack.push("fifth");        System.out.println(stack.pop());        System.out.println(stack.pop());        System.out.println(stack.pop());    }}