欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

两个队列实现一个栈

程序员文章站 2022-04-15 20:38:05
...

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

两个队列实现一个栈