两个队列实现一个栈

问题分析:

    <1>每次push都向_q1中push;
    <2>**注意**:每次pop时,都先判断_q1中是否有数据;

    先看_q1中是否有数据,有数据,将_q1数据移动到_q2,然后将_q2的top数据pop;_q1没有数据,将_q2数据移动到_q1,然后将_q1的top数据pop;

pop场景:

pop场景1:_q1和_q2中都没有数据,assert;
pop场景2:_q1有数据,将_q1数据移动到_q2中,将最后一个数据删除;
pop场景3:_q1为空,_q2有数据,将_q2数据移动到_q1中,将最后一个数据删除;

_q1有数据,进行pop操作:

_q1有数据

_q1没有数据,_q2有数据,进行pop操作:

_q1为空,_q2不为空

代码部分:

class TQueueCSatck
{
public:
    void Push(const int x)
    {
        _q1.push(x);
    }

    bool Empty()
    {
        return _q1.empty() && _q2.empty();
    }

    void Pop()
    {
        assert(!Empty());

        //_q1为空,证明_q2不为空
        if (_q1.empty())
        {
            while (!_q2.empty() && _q2.size() != 1)
            {
                int tmp = _q2.front();
                _q2.pop();
                _q1.push(tmp);
            }
            _q2.pop();
            return;
        }
        //_q1不为空
        while (!_q1.empty() && _q1.size() != 1)
        {
            int tmp = _q1.front();
            _q1.pop();
            _q2.push(tmp);
        }
        _q1.pop();
    }

    size_t Size()
    {
        return _q1.size() + _q2.size();
    }
protected:
    queue<int> _q1;
    queue<int> _q2;
};

测试代码:

void TestTQueueCSatck()
{
    TQueueCSatck q;
    q.Push(1);
    q.Push(4);
    q.Push(5);

    q.Pop();    //_q2:1->4

    q.Push(6);
    q.Push(2);  //_q2:1->4,_q1:6->2

    q.Pop();    //_q1为空,_q2:1->4->6
    q.Pop();    //_q1:1->4,_q2为空
    q.Pop();    //_q1为空,_q2:1
    q.Pop();    //_q1为空,_q2为空
    q.Pop();    //assert
}

本人目前正处于学习之中,如果有考虑的不全面的地方或者错误,希望您能够指出和谅解,便于我们的共同学习和进步!

常见栈和队列面试题
1、实现一个栈,push,pop,求栈中最小元素,时间复杂度O(1)
2、使用两个栈实现一个队列
3、利用一个数组实现两个栈
4、元素出栈合法性

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值