• 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;
        }
    };
    
  • 相关阅读:
    51nod1229 序列求和 V2
    51nod 1228、1258 序列求和
    题解P3711:【仓鼠的数学题】
    伯努利数学习笔记的说...
    题解 P4692 【[Ynoi2016]谁的梦】
    积性函数与卷积
    题解 P5065 【[Ynoi2014]不归之人与望眼欲穿的人们】
    [Ynoi2018]末日时在做什么?有没有空?可以来拯救吗?
    [51nod1965]奇怪的式子
    PGCD2
  • 原文地址:https://www.cnblogs.com/linrj/p/13211312.html
Copyright © 2020-2023  润新知