欢迎光临散文网 会员登陆 & 注册

力扣:用两个栈实现一个队列

2023-03-03 16:30 作者:薄荷硬糖酱  | 我要投稿

题目:

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

难度简单708收藏分享切换为英文接收动态反馈

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

 

示例 1:

输入:["CQueue","appendTail","deleteHead","deleteHead","deleteHead"] [[],[3],[],[],[]]输出:[null,null,3,-1,-1]

示例 2:

输入:["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"] [[],[],[5],[2],[],[]]输出:[null,-1,null,null,5,2]

提示:

  • 1 <= values <= 10000

  • 最多会对 appendTail、deleteHead 进行 10000 次调用

第一个法:

无视题目要求直接用内置函数(我这个屑)

class CQueue {

    queue<int> q;

public:

    CQueue() {

        

    }

    

    void appendTail(int value) {

        q.push(value);

    }

    

    int deleteHead() {

        if(q.empty())return -1;

        int ans = q.front();

        q.pop();

        return ans;

    }

};


/**

 * Your CQueue object will be instantiated and called as such:

 * CQueue* obj = new CQueue();

 * obj->appendTail(value);

 * int param_2 = obj->deleteHead();

 */

第一种法:

class CQueue {

private:

    stack<int> a1;

    stack<int> a2;

public:

    CQueue() {

        

    }

    

    void appendTail(int value) {

        a1.push(value);

    }

    

    int deleteHead() {

        while(!a1.empty()){

            a2.push(a1.top());

            a1.pop();

        }

        if(!a2.empty()){

            int ans = a2.top();

            a2.pop();

            return ans;

        }

        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();

 */

这里是因为每次删除一个元素的时候都把第一个栈的元素放到第二个栈那里,其实是只能在第二个栈空的时候再把第一个栈的全部元素都放进去,不然会破坏了第二个栈的顺序

第二种法:

class CQueue {

private:

    stack<int> a1;

    stack<int> a2;

public:

    CQueue() {

        

    }

    

    void appendTail(int value) {

        a1.push(value);

    }

    

    int deleteHead() {

        if(a2.empty()){

            while(!a1.empty()){

                a2.push(a1.top());

                a1.pop();

            }

        }

        if(!a2.empty()){

            int ans = a2.top();

            a2.pop();

            return ans;

        }

        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();

 */


力扣:用两个栈实现一个队列的评论 (共 条)

分享到微博请遵守国家法律