代码随想录算法训练营第一天 | 232.用栈实现队列、225. 用队列实现栈

day10

栈与队列理论基础:

给了四个问题:

  1. C++中stack 是容器么?
  2. 我们使用的stack是属于哪个版本的STL?
  3. 我们使用的STL中stack是如何实现的?
  4. stack 提供迭代器来遍历stack空间么?

232.用栈实现队列

用两个栈来实现队列,没思路。

Karl思路:一个输入栈STin,一个输出栈STout。

入队列的时候入到输入栈,这个思路单凭自己想不太到,关键在于出队列的时候,先将STin的出到STout里(数据顺序就反过来了),然后从STout出栈。

因为每次从STin到STout都是早先的元素,而且这些元素是符合出队列顺序的,所以等到STout空的时候再将STin的转移过来,批次之间顺序不会乱。

梳理一下就是STin和STout的元素都分别保持有序,这个设计挺妙的。

class MyQueue {
public:
    stack<int> stin, stout;
    //这个构造函数怎么写?
    MyQueue() {
        // 不用写。。。
    }
    
    void push(int x) {
        stin.push(x);
    }
    
    // pop()的实现很巧妙
    int pop() {
        if (stout.empty()) {
            while (!stin.empty()) {
                int tmp = stin.top();
                stin.pop();
                stout.push(tmp);
            } 
        }
        int tmp = stout.top();
        stout.pop();
        return tmp;
    }
    
    // 可以用pop()然后再把弹出来的放到stout的栈顶,但说实话,这个思路也是挺巧妙的,放回peek处也是双栈才可以做到的事
    int peek() {
        if (stout.empty()) {
            while (!stin.empty()) {
                int tmp = stin.top();
                stin.pop();
                stout.push(tmp);
            } 
        }
        return stout.top();
    }
    
    bool empty() {
        if (stin.empty() && stout.empty())
            return true;
        else return false; 
    }
};

225. 用队列实现栈

还是没思路.

// 两个队列的版本
class MyStack {
public:
    queue<int> q1, q2;
    MyStack() {

    }
    
    void push(int x) {
        q1.push(x);
    }
    
    int pop() {
        while (q1.size() != 1) {
            q2.push(q1.front());
            q1.pop();
        }
        int tmp = q1.front();
        q1.pop();
        // q1 = q2; 竟然可以直接复制;
        while (!q2.empty()) {
            q1.push(q2.front());
            q2.pop();
        }
        return tmp;
    }
    
    int top() {
        int tmp = this->pop();
        this->push(tmp);
        return tmp;
    }
    
    bool empty() {
        return q1.empty();
    }
};
// 单队列实现的,也还行。
class MyStack {
public:
    queue<int> q1;
    MyStack() {

    }
    void push(int x) {
        q1.push(x);
    }
    int pop() {
        int size = q1.size();
        while (size > 1) {
            q1.push(q1.front());
            q1.pop();
            size--;
        }
        int tmp = q1.front();
        q1.pop();
        return tmp;
    }
    int top() {
        int tmp = this->pop();
        this->push(tmp);
        return tmp;
    }
    bool empty() {
        return q1.empty();
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值