两队列(栈)实现一个栈(队列)

ModelEngine·创作计划征文活动 10w+人浏览 579人参与

队列的特点是先进先出,尾部插入,头部删除,时间复杂度是o(1)

栈的特点是先进后出,尾部插入,尾部删除,因为他的时间复杂度是o(1)。

1.两个栈实现一个队列

怎么对这两个栈进行操作,从而对外部体现出一个队列的存在?

插入删除的具体规则?

在上面的图中,我们用ST1来模拟栈1,用 ST2来模拟栈2。

插入规则:直接向ST1插入即可.

删除规则:观察ST2是否为空,不空则直接出一个值即可如果ST2为空,则将ST1里面的所有元素,依次倒腾到ST2中,这时ST2就不空了,直接出一个值即可如果ST2和ST1都为空,说明模拟出的队列是一个空队列,则不能出值.

1.当有1 2 3 三个值的时候,先执行插入功能。

2.当我们要输出一个值的时候输出的时候,现将st1里面的全部扔进st2里面,然后在输出一个值1,使得达到先进的先出,此时的队列是1。

3.在插入两个值4  5

4.删除两个值,因为st2有值,则删除的是  2   3,此时的队列是1   2   3

5.继续删除两个值,因为st2是空的,所以将st1的值转移到st2得到

6.删除两个值,删除st2里面的4  5得到的队列就是1   2   3   4   5,模拟了队列先进的先出。

typedef struct TwoStackToQueue
{
	std::stack<int> st1;//ST1
	std::stack<int> st2;//ST2
}TwoStackToQueue;
//入队
bool Push_TSTQ(TwoStackToQueue* tstq, int val)
{
    assert(tstq != NULL);

    //插入规则:无脑的向ST1入
    tstq->st1.push(val);
    return true;
}

//出队
bool Pop_TSTQ(TwoStackToQueue* tstq)
{
    //assert

    //1.如果两个栈同时为空,则直接返回假
    if (tstq->st1.empty() && tstq->st2.empty())
    {
        return false;
    }

    //2.直接去从ST2中取值,如果ST2不空,直接去结束
    if (!tstq->st2.empty())
    {
        tstq->st2.pop();
        return true;
    }
    else
    {
        //3.直接去从ST2中取值,如果ST2空,则说明ST1肯定
    // 不空,则将ST1中的所有元素倒腾到ST2中(倒腾:ST1出
    // 一个值,ST2入一个值),这时ST2就不空,就可以取值了
        while (!tstq->st1.empty())
        {
            tstq->st2.push(tstq->st1.top());
            tstq->st1.pop();
        }

        tstq->st2.pop();
        return true;
    }
}

2.两个队列实现一个栈

插入规则:直接向Q1

插删除规则:首先确保Q1和Q2不能同时为空直接去观察是Q1空还是不空:如果Q1不空,则将Q1全部的数据留一个,剩余的全部倒腾到Q2,此时就可以将Q1剩下的这一个数据出掉如果Q1空,则Q2一定不空,则将Q2全部的数据一个,剩余的全部倒腾到01,此时就可以将Q2剩下的这一个数据出掉

这里的Q1代表的是队列1,Q2代表的是队列2.用队列(先进的先出)模拟栈(先进的后出)。

//1.入栈
bool Push_TQTS(TwoQueueToStack* tqts, ELEMTYPE val)
{
    tqts->Q1.push(val);
    return true;
}
//2.出栈
bool Pop_TQTS(TwoQueueToStack* tqts)
{
    if (tqts->Q1.empty() && tqts->Q2.empty())
    {
        return false;
    }

    if (!tqts->Q1.empty())
    {
        int size = tqts->Q1.size();

        for (int i = 0; i < size - 1; i++)
        {
            tqts->Q2.push(tqts->Q1.front());
            tqts->Q1.pop();
        }
        tqts->Q1.pop();
    }
    else
    {
        int size = tqts->Q2.size();

        for (int i = 0; i < size - 1; i++)
        {
            tqts->Q1.push(tqts->Q2.front());
            tqts->Q2.pop();
        }
        tqts->Q2.pop();
    }
    return true;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值