使用两个栈实现一个队列+使用两个队列实现一个栈

两个问题中数据的出入我只说出,进的问题都一样没什么要讲的东西。

两个栈实现一个队列

如下图所示:
  根据栈的先进先出特性,和要实现的队列的先进后出特性。首先定义一个spush存储数据,另一个spop用以操作数据,图中红框内为实现的Myqueue,spush中1、2、3、4、5、6为入栈顺序也是压入队列的顺序,那么出栈顺序为6、5、4、3、2、1,首先spush出栈,压入spop,达到下次出栈顺序为1、2、3、4、5、6,即myqueue的出队列顺序。
这里写图片描述

#include <stack>
#include <deque>
#include <iostream>
using namespace std;

template<class T>
class Myqueue
{
public:
    void Push(const T& data)
    {
        spush.push(data);
    }
    void Pop()
    {
        if (spush.empty())
        {
            return ;
        }
        else
        {
            while(spush.size()>1)
            {
                T tmp=spush.top();
                spop.push(tmp);
                spush.pop();
            }
            spush.pop();
            while (!spop.empty())
            {
                T tmp=spop.top();
                spush.push(tmp);
                spop.pop();
            }
        }
    }
    bool Empty()
    {
        return spush.empty();
    }
    size_t Size()
    {
        return spush.size();
    }
protected:
    stack<T> spush;
    stack<T> spop;
};
两个队列实现一个栈

如下图所示:
  根据队列先进先出的特性,就像漏斗一样,先将数据倒进去到qpush,顺序为1、2、3、4、5、6,要得到漏斗最后倒进去的数据6,那么我们可以将6之前的数据先漏出来到qpop,只剩下6,这样就得到了想要的数据,之后再将刚刚漏出来的其余数据再装回去,方便下次操作,直到漏斗空了。
这里写图片描述

template<class K>
class MyStack
{
public:
    void Push(const K& data)
    {
        qpush.push(data);
    }
    void Pop()
    {
        if (qpush.empty())
        {
            return ;
        }
        else
        {
            while(qpush.size()>1)
            {
                K tmp=qpush.front();
                qpop.push(tmp);
                qpush.pop();
            }
            qpush.pop();
            while (!qpop.empty())
            {
                K tmp=qpop.front();
                qpush.push(tmp);
                qpop.pop();
            }
        }
    }
protected:
    queue<K> qpush;
    queue<K> qpop;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值