算法————双栈实现队列、双队列实现栈、实现一个栈Push(出栈)Pop(入栈)Min(返回最小值的操作)的时间复杂度为O(1)



一.双栈实现队列

1.思路原理:队列的特点,先进先出;栈的特点,后进先出;原理刚好相反,那么无非是俩个栈互相“倒“或者“导”,这都不是重点了,有了这个初步思路我们就得想办法来实现如何倒了。
2“倒”或者“导”思路图:
法①:核心原理:每次插入都得倒回popstack栈的所有元素,最后所有的元素回归popstack

这里写图片描述

法一代码:
template<class T>
class QueueByTwoStack
{
    //从插入开始一直将popstack先倒回到Pushstack然后再插入,再倒回。
public:
    void Push(const T& data)//法一检查popstack是否有未倒回的的元素,然后倒回并插入
    {
            while (!PopStack.empty())
            {
                PushStack.push(PopStack.top());
                PopStack.pop();
            }
            PushStack.push(data);
            while (!PushStack.empty())//插入后重新倒回
            {
                PopStack.push(PushStack.top());
                PushStack.pop();
            }
    }
    void Pop()
    {
        assert(!PopStack.empty());
        PopStack.pop();
    }
    T& Front()
    {
        return PopStack.top();
    }
    size_t Size()
    {
        return PopStack.size() + PushStack.size();
    }
    bool Empty()
    {
        return (PopStack.empty() && PushStack.empty());
    }
protected:
    stac
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值