剑指 Offer 09. 用两个栈实现队列

题目:

思路:

【1】利用栈的特性来实现队列的特性,首先栈是后进先出的,所以插入的时候先放到A栈,而取出的时候是从B栈取出。那么B栈是如何填充的,当B栈为空的时候,又遇到取出,必先判断A栈是否为空,如果不为空,将A栈的数据导入到B栈。这样B栈的最上面数据其实就已经是满足先进先出的队列特性了。而且当B栈还没空的时候是不允许A栈再次将数据导入进来,避免顺序错乱。

代码展示:

//时间35 ms击败93.78%
//内存48.6 MB击败40.72%
class CQueue {
    Deque<Integer> inStack;
    Deque<Integer> outStack;

    public CQueue() {
        inStack = new ArrayDeque<Integer>();
        outStack = new ArrayDeque<Integer>();
    }

    public void appendTail(int value) {
        inStack.push(value);
    }

    public int deleteHead() {
        if (outStack.isEmpty()) {
            if (inStack.isEmpty()) {
                return -1;
            }
            in2out();
        }
        return outStack.pop();
    }

    private void in2out() {
        while (!inStack.isEmpty()) {
            outStack.push(inStack.pop());
        }
    }
}

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue obj = new CQueue();
 * obj.appendTail(value);
 * int param_2 = obj.deleteHead();
 */

 

posted @ 2023-01-30 17:56  忧愁的chafry  阅读(7)  评论(0编辑  收藏  举报