栈和队列的刷题集

文章介绍了如何使用两个栈来模拟队列的四个基本操作:top、pop、push和empty。在push时,元素入in栈;pop和top时,如果out栈为空,则将in栈所有元素转移到out栈,再执行操作。empty方法检查两个栈是否都为空。
摘要由CSDN通过智能技术生成

用栈实现队列:

题干:

这样一个题目,在力扣中出现,用栈实现队列的四个操作:

1.queue.top():得到队首元素。

2.queue.pop():队首出队。

3.queue.push():队尾入队。

4.queue.empty():判断队列是否为空,1为空,0为非空。

分析思路:

一个栈肯定不行,我们考虑用两个栈行不行?

搬运一下Carl师兄的动态实现图,毕竟太生动了。 

 两个栈,一个是输入栈in,一个是输出栈out。

首先我们来看一下如何判断队列为空。这个没什么难度,由于两个栈共同组成一个队列,因此当两个栈都为空时,整个队列为空。

进队push操作,正常往in栈压就相当于已经进入队列内,这时候我们不需要管out栈,不需要往out栈压数据。出队pop操作,Cral师兄的思路非常清晰。出队的实现肯定需要out栈来做,那么肯定要把已经压入in栈的数据转到out栈来做。这个过程其实可以将栈的性质彻底颠倒。原本3,4在in栈内,4后入则先出,当来到了out栈,就变成了栈底数据,变成了后入后出。后入后出,不就是队列了吗?

在具体pop操作实现上,需要判断out栈是否为空,如果为空,那么从in栈导入全部的数据,然后一一出栈。如果非空,那么直接出栈即可。

top操作实际上和pop操作差不多。

答案:

#include<bits/stdc++.h>
using namespace std;
class MyQueue {
public:
    stack<int> in;
    stack<int> out;
    void push(int x) {
        in.push(x);
    }
    int pop() {
        int e;
        if(out.empty())
        {
            while (!in.empty())
            {
                out.push(in.top());
                in.pop();
            }
        }
        e = out.top();
        out.pop();
        return e;
    }
    
    int peek() {
        int e = 0;
        if (out.empty())
        {
            while (!in.empty())
            {
                out.push(in.top());
                in.pop();
            }
        }
        e = out.top();
        return e;
    }
    
    bool empty() {
        return in.empty() && out.empty();
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值