【代码随想录】刷题Day10

基础知识

stack和queue不是容器,是适配器实现的,它的底层可以是list、deque或者vector这些线性表适配而来

栈和队列提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。 不像是set 或者map 提供迭代器iterator来遍历所有元素。

1.栈实现队列

232. 用栈实现队列

1.s1用来当作进队列的口;s2用来当作出队列的口

2.s1不需要什么操作,一旦push,那s1跟着push即可

2.s2如果为空,但是s1不为空,此时pop,需要把s1的值pop到s2中;但是如果s1有值,则不用做任何操作。最后把s2的值pop出去

3.peek的逻辑和pop相似,如果s2为空,需要s1pop进去,最后返回s2的top即可

4.判空就看s1和s2是不是都为空 -- 不过不应该直接copy代码,复用代码更加可观

class MyQueue {
    stack<int> s1;
    stack<int> s2;
public:
    MyQueue() {}
    
    void push(int x) {
        s1.push(x);
    }
    
    int pop() {
        if(s2.empty())
        {
            while(!s1.empty())
            {
                s2.push(s1.top());
                s1.pop();
            }
        }
        int ret = s2.top();
        s2.pop();
        return ret;
    }
    
//    int peek() {
//        if(s2.empty())
//        {
//            while(!s1.empty())
//            {
//                s2.push(s1.top());
//                s1.pop();
//            }
//        }
//        int ret = s2.top();
//        return ret;
//    }

    int peek() {
        int tmp = this->pop();
        s2.push(tmp);
        return tmp;
    }
    
    bool empty() {
        if(s1.empty()&&s2.empty())
            return true;
        return false;
    }
};

2.队列实现栈

225. 用队列实现栈

我们只需要设计两个队列

1.入队列就是将一个数据入已经有数据的队列中

2.出队列就是将已有数据的队列全部入到另一个队列中,此时我们会发现,其实最后一个出队列的就是栈先出的数据,所以我们在入队列前要判断出队列的大小是否为一,如果为一则这个数就是需要被出的数据,那么我们就不需要将它入另一个队列进去即可

class MyStack {
    queue<int> q1;
    queue<int> q2;
public:
    MyStack() {}
    
    void push(int x) {
        if(q2.empty())
            q1.push(x);
        else
            q2.push(x);
    }
    
    int pop() {
        int tmp;
        if(q2.empty())
        {
            while(q1.size()!=1)
            {
                q2.push(q1.front());
                q1.pop();
            }
            tmp = q1.front();
            q1.pop();
        }
        else
        {
            while(q2.size()!=1)
            {
                q1.push(q2.front());
                q2.pop();
            }
            tmp = q2.front();
            q2.pop();
        }
        return tmp;
    }
    
    int top() {
        int ret = this->pop();
        this->push(ret);
        return ret;
    }
    
    bool empty() {
        if(q1.empty()&&q2.empty())
            return true;
        return false;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

灼榆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值