【数据结构】--几道栈和队列面试题

本文探讨了如何使用两个栈实现一个队列,两个队列实现一个栈,以及创建一个具有O(1)操作时间复杂度的最小元素栈。此外,还介绍了判断元素入栈出栈合法性的方法以及用一个数组实现两个栈的不同策略。每个主题都附带了解决方案的思路分析和代码实现。
摘要由CSDN通过智能技术生成

用两个栈实现一个队列

  • 1、思路分析
    拿到这道题,会有以下几种思路:
    思路一:

    • 入队时,将所有的元素压入到s1中
    • 出队时,将s1中的所有元素倒入到s2中,然后让s2中栈顶的元素出栈,然后将s2中所有的元素倒入到s1中

    问题所在:我们不难发现,在这种解法中,要进行来回倒栈,时间复杂度就会比较大,做起来也比较麻烦
    思路二:
    说明:是对第一种的优化我们不难发现,其实在进行倒栈的时候,没必要进行最后一个元素的倒入

    • 入队时,先判断s1是否为空,如果不为空,说明所有的元素都在s1中,此时将入队的元素直接压入s1中;如果s1为空,将s2中所有的元素倒入到s1中,将入队的元素压入s1中
    • 出队时,如果s2不为空,将s2栈顶的元素弹出,如果s2为空,将s1中除最后一个元素压入s2中,将最后一个元素出栈

    说明:这种方法其实是将两个栈更进一步的同时利用。每次出队后,并不将元素“倒回”s1,如果赶上下次还是出队操作,效率会高一些。
    思路三:

    • 入队时,将所有的元素压入s1
    • 出队时,判断s2是否为空,如果为不为空,直接将栈顶的元素弹出,如果s2为空,将s1中的元素倒入s2中,将最后一个元素弹出
  • 2、代码实现

(说明:对第三种方法的实现)
#include<iostream>
#include<stack>
using namespace std;
template<class T>
class Queue
{
public:
    Queue()
    {}

    void Push(const T& x)
    {
        s1.push(x); 
    }

    void Pop()
    {
        if(s1.empty() && s2.empty())
            cout<<"队列为空,无法进行删除!"<<endl;

        if(s2.empty())
        {
            while(!s1.empty())
            {
                s2.push(s1.top());
                s1.pop();
            }
        }
        s1.pop();
    }

    bool Empty()
    {
        return ((s1.empty()) && (s2.empty()));
    }

    T& Front()
    {
        if(s1.empty() && s2.empty())
        {
            cout<<"队列为空!"<<endl;
        }
        if(s2.empty())
        {
            while(!s1.empty())
            {
                s2.push(s1.top());
                s1.pop();
            }
        }
        return s2.top();
    }

private:
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值