两个栈实现一个队列

Posted Edwin Xu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两个栈实现一个队列相关的知识,希望对你有一定的参考价值。

分析

使用两个栈,一个主(s1),一个辅(s2)
我们并不需要真正实现类似队列的结构,只需要实现队列的功能即可:
push:直接push到s1即可,这时和队列的性质相反(FIFO vs. LIFO)
pop:目标是拿到队头,即栈底,只需要把除栈底外的元素移动到辅助栈s2,然后弹出栈底,最后把s2元素再移回来
peek:和pop类似,不要弹出s1栈底即可。

分析清楚了实现也就不难了。

实现:

public class TwoStackAsQueue {
    private Stack<Integer> s1 ;
    private Stack<Integer> s2 ;

    public TwoStackAsQueue(){
        s1 = new Stack<>();//主
        s2 = new Stack<>();//辅
    }

    /*
    push的时候:直接push到s1
     */
    public void push(int a){
        s1.push(a);
    }

    //把除栈底外全部移到另一个栈,移除栈底,在把元素移回来
    public boolean pop(){
        if (s1.size()==0){
            System.out.println("Empty");
            return false;
        }
        while (s1.size()!=1){
            s2.push(s1.pop());
        }
        s1.pop();
        while (s2.size()!=0){
            s1.push(s2.pop());
        }
        return true;
    }


    public int peek(){
        if (s1.size()==0){
            System.out.println("Empty");
            return -1;
        }
        while (s1.size()!=1){
            s2.push(s1.pop());
        }
        int res =  s1.peek();
        while (s2.size()!=0){
            s1.push(s2.pop());
        }
        return res;
    }

    public int size(){
        return s1.size();
    }

    public static void main(String[] args) {
        TwoStackAsQueue tsa = new TwoStackAsQueue();
        tsa.push(1);
        tsa.push(2);
        tsa.push(3);
        System.out.println(tsa.size());
        System.out.println(tsa.peek());
        tsa.pop();
        tsa.pop();
        System.out.println(tsa.size());
        System.out.println(tsa.peek());
        /*
        output:
            3
            1
            1
            3
         */
    }
}

以上是关于两个栈实现一个队列的主要内容,如果未能解决你的问题,请参考以下文章

两个栈实现一个队列

用两个栈实现队列-剑指Offer

用两个栈实现一个队列

用两个栈实现一个队列(C++)

剑指offer-用两个栈实现队列

剑指offer用两个栈实现队列