其他分享
首页 > 其他分享> > 《从头再来》剑指offer.09 用两个栈实现队列

《从头再来》剑指offer.09 用两个栈实现队列

作者:互联网

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

如果学过一点基础的数据结构的话,我们可以知道队列和栈是两个不同的概念。

队列讲究的是FIFO,也就是先进先出,因为队列只能从一端添加元素,在另一端删除元素。允许添加元素的一端被称为队尾,允许删除元素的一端被称为队头。

栈讲究的是FILO,也就是先进后出,因为栈只能从一端添加元素,同时也只能在这一端删除元素。允许添加和删除元素的一端被称为栈顶。

用两个栈实现队列的基本思想是一个栈只用于添加元素(例如把它叫做左栈stackL),另一个栈用于辅助实现删除元素(把它叫做右栈stackR)。如果要添加元素,则直接在左栈添加即可(正常入左栈)。但是如果要删除元素的话,就不一样了,因为栈只能删除栈顶的元素,但是此处的删除元素显然说的是删除栈底的元素,此时就需要借助右栈来帮助实现这个目的了。第一步,先将左栈的所有元素出栈,压入右栈。此时右栈的栈顶元素即是原左栈的栈底元素,也就是我们要删除的元素。第二步,删除右栈的栈顶元素。第三步,将右栈剩余的元素出栈,按顺序压入左栈。即完成了两个栈实现队列的目的。

class CQueue {
public:
    stack<int>  stackL;
    stack<int>  stackR;
    CQueue() {

    }//构造函数可以直接不写
    
    void appendTail(int value) {
        //正常添加元素到左栈
        stackL.push(value);
    }
    
    int deleteHead() {
        //三步
        //第一步,移栈
        while(!stackL.empty()){
            int val = stackL.top();
            stackR.push(val);
            stackL.pop();
        }
        //第二步,删除元素
        int result = -1;//注意这里的定义
        if(!stackR.empty()){
            result = stackR.top();
            stackR.pop();
        }
        //第三步,移栈
        while(!stackR.empty()){
            int val = stackR.top();
            stackL.push(val);
            stackR.pop();
        }
        return result;
    }
};

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

《从头再来》

标签:stackL,从头再来,删除,队列,offer.09,元素,左栈,stackR
来源: https://www.cnblogs.com/azie420/p/14853679.html