两个队列实现一个栈

    用两个队列实现一个栈的原理是这样的. 规定两个队列, 必须有一个队列是非空, 一个队列是空.每次入栈时必须往非空队列中入, 而每次出栈时, 必须将非空队列里的元素装到空队列中, 直到非空队列中只有一个元素时, 此时就将剩下的这个元素出栈即可. 而取栈顶元素时, 和出栈一样, 先将非空队列中的元素先装到空队列中, 直到非空队列中只有 一个元素时, 此时就将这个元素去取出来, 然后将其插入到空队列中, (不要忘记每次要将最后的那个元素出栈)
    1. 数据结构

typedef struct StackBy2Que
{
    SeqQue que1;
    SeqQue que2;
}StackBy2Que;

    2. 初始化

void StackBy2QueInit(StackBy2Que* stack)
{
    if(stack == NULL)
    {
        return;//非法输入
    }
    SeqQueInit(&(stack -> que1));
    SeqQueInit(&(stack -> que2));
}

     这里写图片描述
    3. 入栈

void StackBy2QuePush(StackBy2Que* s, SeqQueType value)
{
    if(s == NULL)
    {
        return;
    }
    SeqQue input;
    SeqQue output;
    SeqQueInit(&input);
    SeqQueInit(&output);
    if(s -> que1.size != 0)
    {
        SeqQuePush(&(s -> que1), value);
        return;
    }
    SeqQuePush(&(s -> que2), value);
}

    这里写图片描述
    4. 出栈

void StackBy2QuePop(StackBy2Que* s)
{
    if(s == NULL)
    {
        return;//非法输入
    }
    SeqQueType value;
    if(s -> que1.size == 0 && s -> que2.size == 0)
    {
        return;//空队列
    }

    if(s -> que1.size != 0)
    {
        while(s -> que1.size > 1)
        {
            SeqQueGetFront(&(s -> que1), &value);
            SeqQuePush(&(s -> que2), value);
            SeqQuePop(&(s -> que1));
        }
        SeqQuePop(&(s -> que1));
        return;
    }
    if(s -> que2.size != 0)
    {
        while(s -> que2.size > 1)
        {
            SeqQueGetFront(&(s -> que2), &value);
            SeqQuePush(&(s -> que1), value);
            SeqQuePop(&(s -> que2));
        }
        SeqQuePop(&(s -> que2));
        return;
    }
}

        这里写图片描述
    5. 取栈顶元素

int StackBy2QueTop(StackBy2Que* s, SeqQueType* value)
{
    if(s == NULL || value == NULL)
    {
        return -1;//非法输入
    }
    if(s -> que1.size == 0 && s -> que2.size == 0)
    {
        return -1;//空栈
    }

    if(s -> que1.size != 0)
    {
        while(s -> que1.size > 1)
        {
            SeqQueGetFront(&(s -> que1), value);
            SeqQuePush(&(s -> que2), *value);
            SeqQuePop(&(s -> que1));
        }
       SeqQueGetFront(&(s -> que1), value);
       SeqQuePush(&(s -> que2), *value);
       return 1;
    }
    if(s -> que2.size != 0)
    {
        while(s -> que2.size > 1)
        {
            SeqQueGetFront(&(s -> que2), value);
            SeqQuePush(&(s -> que1), *value);
            SeqQuePop(&(s -> que2));
        }
       SeqQueGetFront(&(s -> que2), value);
       SeqQuePush(&(s -> que1), *value);
       return 1;
    }
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值