剑指Offer 09.用两个栈实现队列

原题链接

题解

题目的大意就是利用两个栈来模拟队列的插入和删除,最容易想到的就是声明两个栈a, b,a这个栈用来做插入,b用来做删除作用。
当我们数据插入到栈中的,栈中的数据顺序是和删除的顺序相反的,①这就可以利用b这个栈了,将a中的数据弹出,依次压入b中,那么b中就是删除的顺序了。
②当我们删除的时候,只要b中不为空,直接将b的栈顶弹出并返回,③反之重复①②操作,如果b还是空,则返回-1

代码如下

class CQueue {
public:
    stack<int> a, b;//a是插入数组,b是删除数组
    CQueue() {

    }
    
    void appendTail(int value) {
        a.push(value);
    }
    
    int deleteHead() {
        if(b.size() == 0){//当b中没有数据的时候,才需要将a中的数据给b,那么b中就存在删除的序列
            while(a.size()){
                b.push(a.top());
                a.pop();
            }
        }

        if(b.size()){
            int res = b.top();
            b.pop();
            return res;
        }
        else return -1;
    }
};

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

开始的时候,自己写的时候,在做完删除之后,还把b中现有的数据还给了a中了,然后每一次删除的时候都要两个栈来回换,其实,直接可以把删除的序列直接放在b中,当b为空的时候,才将a中的给b就可以了

原文地址:https://www.cnblogs.com/Lngstart/p/13212759.html