zoukankan      html  css  js  c++  java
  • LeetCode剑指 Offer 09. 用两个栈实现队列

    开两个栈helper和Queue来模拟队列,helper用来中转元素,Queue存放倒序(与元素入队顺序相反)的元素。
    这样pop()的时候就相当于最先进入“队列”的元素出队。

    举个例子:最开始有四个元素1, 2, 3, 4要入队,由于我们只有栈,我们希望在栈Queue中存放的顺序是4, 3, 2, 1(分别是栈底到栈顶),
    这不,我们这好有一个helper么,于是把元素全都放到helper里,此时helper中从栈底到栈顶的元素分别是1, 2, 3, 4,这样可模拟不了“出队”,
    于是再逐个将栈顶元素出栈,并压入Queue栈中,于是Queue中就存放4, 3, 2, 1(顺序为从栈底到栈顶),要出队只需要pop()一下就行了。

    题目要求deleteHead(即出队)的时候,队列为空返回-1,我们只需要判断栈Queue是否为空即可。如果非空就直接pop()。

    对于入队(appendTail),要注意原来的栈Queue可能非空,所以入队前需要把Queue中所有的元素逐个弹出并压入helper中,

    比如最开始的入队顺序如果是1, 2, 3, 4,Queue中元素顺序从栈底到栈顶为4, 3, 2, 1,
    逐个弹出压入到helper中后helper中从栈底到栈顶的元素分别为1, 2, 3, 4(就是最开始的入队顺序),
    这时我们再把要添加(入队)的元素压入helper中,后面的操作就简单了,把helper中的所有元素弹出并压入栈Queue中。

    class CQueue {
    stack<int> helper;
    stack<int> Queue;
    public:
        CQueue() {                                         //类的构造函数,不用管
    
        }
        
        void appendTail(int value) {
            while(!helper.empty()) {                       //先清空helper栈,再把Queue中的元素转移到helper中
                helper.pop();
            }
            while(!Queue.empty()) {
                int topElement = Queue.top();
                helper.push(topElement);
                Queue.pop();
            }
            helper.push(value);
            while(!helper.empty()) {
                int topElement = helper.top();
                Queue.push(topElement);
                helper.pop();
            }
        }
        
        int deleteHead() {
            if(Queue.empty()) {
                return -1;
            }
            int deletedElement = Queue.top();
            Queue.pop();
            return deletedElement;
        }
    };
    
  • 相关阅读:
    2019南昌网络赛-I(单调栈+线段树)
    poj3250(单调栈模板题)
    poj2528(线段树+离散化)
    poj2828(线段树查找序列第k小的值)
    Seikimatsu Occult Tonneru(网络流,状态数(建不建边)不多时,可考虑直接进行枚举
    A. Coffee Break(思维题,类似于邻接表的head数组用法)
    E. Paint the Tree(树形dp)
    cdq分治学习
    2018SEERC Points and Rectangles (CDQ分治)
    SEERC 2018 Inversion
  • 原文地址:https://www.cnblogs.com/linrj/p/13211312.html
Copyright © 2011-2022 走看看