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;
        }
    };
    
  • 相关阅读:
    jQuery-选择器
    Html-CSS-细节处理
    JS-练习题
    将博客搬至CSDN
    Linux学习(推荐学习资源)——保持更新
    借助Git实现本地与GitHub远程双向传输(同步GitHub仓库)以及一些使用错误解决
    Linux学习使用Vim
    linux学习之Ubuntu
    在docker中创建使用MySQL,并实现远程连接navicat
    Swing系列之控件一
  • 原文地址:https://www.cnblogs.com/linrj/p/13211312.html
Copyright © 2011-2022 走看看