代码随想录打卡第十天 | 栈与队列 leetcode232&225

目录

232 -  用栈实现队列

思路:两杯子倒水

原则:s1用来存储,s2用来操作;

提交代码

225 - 用队列实现栈

思路:两截水管倒水

原则:q1用来存储,q2用来操作;



232 -  用栈实现队列

思路:两杯子倒水

1、两个栈:s1和s2;

2、数据保存在s1中;

3、pop时,将s1倒入s2,s2.pop; 再将s2剩余数据倒入s1;

4、peek时,将s1倒入s2,s2.top; 再将s2数据倒入s1;

原则:s1用来存储,s2用来操作;

提交代码

class MyQueue {
public:
    MyQueue() {

    }

    void push(int x) {
        stk1.emplace(x);
    }

    int pop() {
        int size1 = stk1.size();
        for(int i = 0 ; i < size1; ++i){
            stk2.emplace(stk1.top());   //stk1倒入stk2
            stk1.pop(); //stk1删除
        }
        int ret = stk2.top();

        stk2.pop();     //stk2取出头节点
        int size2 = stk2.size();
        for(int i = 0; i < size2; ++i){
            stk1.emplace(stk2.top());   //stk2又倒回stk1
            stk2.pop();
        }
        return ret;
    }

    int peek() {
        int size1 = stk1.size();
        for(int i = 0 ; i < size1; ++i){
            stk2.emplace(stk1.top());   //stk1倒入stk2
            stk1.pop();
        }
        int ret = stk2.top();
        int size2 = stk2.size();
        for(int i = 0; i < size2; ++i){
            stk1.emplace(stk2.top());   //stk2又倒回stk1
            stk2.pop();
        }
        return ret;
    }

    bool empty() {
        return stk1.empty();
    }

    void test(){
        MyQueue* obj = new MyQueue();
        obj->push(1);
        obj->push(2);

        int param_3 = obj->peek();
        int param_2 = obj->pop();
        bool param_4 = obj->empty();
    }

private:
    stack<int> stk1;
    stack<int> stk2;
};

225 - 用队列实现栈

思路:两截水管倒水

1、两个队列:q1和q2;

2、push时,q1.push(),数据存入q1;

3、top时:q1前n-1个数据流入q2; q1.front()取出最后一个数据; 将最后一个数据流入q2; 将q2数据全部推回q1;

4、pop时:q1前n-1个数据流入q2; q1.front()取出最后一个数据; q1.pop()将最后一个数据删除; 将q2数据全部推回q1;

原则:q1用来存储,q2用来操作;

class MyStack {
public:
    MyStack() {

    }

    void push(int x) {
        q1.emplace(x);
    }

    int pop() {
        int size1 = q1.size();
        for(int i = 0; i < (size1 - 1); ++i){   //将q1前n-1个数据流入q2
            q2.emplace(q1.front());
            q1.pop();
        }
        int ret = q1.front();  //取出最后一个数据
        q1.pop();               //删除最后一个数据
        int size2 = q2.size();
        for(int i = 0; i < size2; ++i){ //将q2的数据全部再退回至q1
            q1.emplace(q2.front());
            q2.pop();
        }
        return ret;
    }

    int top() {
        int size1 = q1.size();
        for(int i = 0; i < (size1 - 1); ++i){   //将q1前n-1个数据流入q2
            q2.emplace(q1.front());
            q1.pop();
        }
        int ret = q1.front();  //取出最后一个数据
        q1.pop();               //删除最后一个数据
        int size2 = q2.size();
        for(int i = 0; i < size2; ++i){ //将q2的数据全部再退回至q1
            q1.emplace(q2.front());
            q2.pop();
        }
        q1.emplace(ret);    //最后一个数据再添加至q1
        return ret;
    }

    bool empty() {
        return q1.empty();
    }

    void test(){
         MyStack* obj = new MyStack();
         obj->push(1);
         obj->push(2);
         int param_3 = obj->top();
         int param_2 = obj->pop();
         int param_5 = obj->pop();
         bool param_4 = obj->empty();
    }

private:
    queue<int> q1;
    queue<int> q2;
};

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铁中棠ang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值