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;
    }
};

猜你喜欢

转载自www.cnblogs.com/linrj/p/13211312.html