两个栈模拟实现一个队列

  • 题目:用两个栈实现一个队列,分别完成在队列尾部插入节点以及在队列头部删除节点的功能。
  • 思路解析:我们通过一个具体的例子来寻找解决这个问题的办法,首先插入元素1我们不妨插入到stack1中,这时候stack2中为空,在压入2,3两个元素。此时栈顶元素是3,stack2仍然是空,队列的特性是先进先出,删除操作删除的元素应该是1,所以我们将stack1的元素全部压入到stack2中此时stack2栈顶的元素就是最先压入的元素1此时将其弹出栈,就完成了队列的删除 操作,下次在需要删除时,stack2栈顶仍是最先插入到队列的元素,直接弹出即可,需要插入的元素仍然插入到stack1中,直到stack2的元素全部弹出,再进行删除操作时又将stack1的元素全部压入到stack2中。因此我们总结出了其中的规律。
    .插入时直接插入到stack1中。
    .删除时stack2为空,将stack1的元素全部压入到stack2中,否则直接弹出栈顶元素。

  • 操作图解:
    这里写图片描述

  • 实现代码:

template <typename T>
class MyQueue
{
public:
    void PushBack(const T &data)
    {
        stack1.push(data);//总是将元素插入到stack1中。
    }
    void PopFront()
    {
        if (!stack2.empty())
        {
            stack2.pop();//如果stack2不为空stack2栈顶的元素就是最先进队列的元素
        }
        else//否则将stack1的元素压入到stack2中再将stack2栈顶的元素弹出
        {
            while (!stack1.empty())
            {
                T &temp = stack1.top();
                stack2.push(temp);
                stack1.pop();
            }
            if (!stack2.empty())//注意栈里没有元素的情况
                stack2.pop();
        }
    }
private:
    stack<T> stack1;
    stack<T> stack2;
};
  • 题目:用两个队列实现一个栈,分别完成在栈里插入节点以及在栈顶删除节点的功能。
  • 思路解析:首先queue1中插入元素1,2,3删除元素时栈的操作是后进先出,因此需要删除的元素是3,此时queue1对首元素是1,queue2为空,我们可以依次将queue1的元素压入到queue2中,直到只剩一个元素,此时这个元素正好是最后插入到栈中,需要删除的元素,再要插入时插入到queue2中,删除时我们可以采取同样的方法,我们可以依次将queue2的元素压入到queue1中,这样我们就总结出了相应的规律。
    .插入时都为空插入到queue1中,否则插入到不为空的队列中。
    .删除时依次将不控的队列中的元素移动到空的队列中,直到剩余一个元素,将其弹出。

  • 操作图解
    这里写图片描述

  • 实现代码:
template <typename T>
class MyStack
{
public:
    void PushBack(const T &data)
    {
        if (queue1.empty() && queue2.empty())//插入时两个队列都为空插入到queue1中
            queue1.push(data);
        else if (!queue1.empty())//否则插入到不为空的队列中
            queue1.push(data);
        else
            queue2.push(data);
    }
    void PopBak()
    {
        if (!queue1.empty())//删除时将不为空的队列中元素移到空队列中,并将最后一个元素删除
        {
            while (queue1.size() > 1)
            {
                T &data = queue1.front();
                queue2.push(data);
                queue1.pop();
            }
            queue1.pop();
        }
        else if (!queue2.empty())
        {
            while (queue2.size() > 1)
            {
                T &data = queue2.front();
                queue1.push(data);
                queue2.pop();
            }
            queue2.pop();
        }
    }
private:
    queue<T> queue1;
    queue<T> queue2;
};

完整代码请戳:
https://coding.net/u/Hyacinth_Dy/p/MyCode/git/blob/master/%E9%9D%A2%E8%AF%95%E9%A2%985-%E4%B8%A4%E4%B8%AA%E9%98%9F%E5%88%97/%E6%A0%88%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA%E6%A0%88/%E9%98%9F%E5%88%97

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值