浅谈用栈实现队列和队列实现栈

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

浅谈用栈实现队列和队列实现栈:

我们都知道栈的特点是先进先出的,而队列的特点是先进后出的,那么我们是否有办法利用栈来实现先进后出,队列来实现先进先出呢。


提示:以下是本篇文章正文内容,下面案例可供参考(这里我们讲的是链式栈和链式队列)

一、栈的特点

栈的特点是先进先出
入栈:
在这里插入图片描述
出栈:
在这里插入图片描述

二、队列的特点

队列的特点是先进后出
入队:
在这里插入图片描述
出队:
在这里插入图片描述

三、用栈来实现队列

在这里我们可以定义两个栈S1和S2,可以让S1作为队列的入口,负责插入新元素;S2作为队列的出口,负责移除老的元素。
在这里插入图片描述
入队列
在这里我们不管S1中有没有之前的元素,直接直接把元素压入 stack1
在这里插入图片描述
出队:
如果 S2 不为空,则直接弹出 S2 中的元素,再将S1的元素倒入S2中,然后弹出 S2 中的栈顶元素;如果 S2 为空,则将 S1 中的所有元素倒入 S2 中,然后弹出 S2 中的栈顶元素。
在这里插入图片描述

我们可以清楚的记得这列数的入队顺序是0,1,2,3而出队的顺序也是0,1,2,3。如此便实现了用两个栈来实现队列的操作

1.定义两个栈

代码如下(示例):

struct MyQueue
{
    LStack*s1;
    LStack*s2;
};
typedef struct MyQueue MyQueue;
void InitMyQueue(MyQueue*q)
{
    q->s1=InitLStack();
    q->s2=InitLStack();
}

2.入队

代码如下(示例):

void MyQPush(MyQueue*q,ElementType element)
{
    SPush(q->s1,element);
}
bool IsMyQueueEmpty(MyQueue*q)//判定队列是否为空
{
    return IsStackEmpty(q->s1)&&IsStackEmpty(q->s2);
}

2.出队

代码如下(示例):

void MyPop(MyQueue*q)
{
    if (IsMyQueueEmpty(q)==true)
    {
        printf("队列为空\n");
        return ;
    }
    while(IsStackEmpty(q->s2)==false)
    {
    	SPop(q->s2);
    }
    while(IsStackEmpty(q->s1)==false)
    {
        SPush(q->s2,*GetSTop(q->s1));
        SPop(q->s1);
    }   
        SPop(q->s2);
}

三、用队列来实现栈

在这里我们可以定义两个队列Q1和Q2,
此方法的核心思想就是把插入其中一个队列的元素赶到另一个队列里面,只留最后一个元素在原来的队列里,然后把原来队列里最后那个元素取出来(获取栈顶元素)
其实我们插入Q1然后把Q1里插入的元素给赶到Q2里和插入Q2然后把Q2里插入的元素给赶到Q1里时一样的
但是我们写函数接口时总不能想插哪个队列就插哪个队列,所以我们加一个判定条件:当Q1为空时,我们插入Q2里,然后把Q2的元素赶到Q1里
当Q2为不空时,我们插入Q1里,然后把Q1的元素赶到Q2里

在这里插入图片描述

1.定义两个队列

代码如下(示例):

struct MyStack
{
    LQueue* q1;
    LQueue* q2;
    ElementType data;//存储栈顶元素
};
typedef struct MyStack MyStack;
void InitMyStack(MyStack*s)
{
    s->q1=InitLQueue();
    s->q2=InitLQueue();
}

2.入队

代码如下(示例):

void MySPush(MyStack*s,ElementType element)
{
    if (IsQueueEmpty(s->q1)==true)
    {
        QPush(s->q2,element);
    }
    else
    {
        QPush(s->q1,element);
    }
}

2.获取栈顶元素

代码如下(示例):

ElementType* MySPop(MyStack*s)
{
    if(IsQueueEmpty(s->q1)==true&&IsQueueEmpty(s->q2)==true)
    {
        printf("栈为空\n");
        return NULL ;
    }
    else if (IsQueueEmpty(s->q1)==true)
    {   //把队列中的数据放在另一个队列中,只剩一个,还剩的一个就是栈顶元素
        while (GetQueuelen(s->q2)>1)
        {
            QPush(s->q1,*GetFront(s->q2));
            QPop(s->q2);
        }
        //获取栈顶元素
        s->data=*GetFront(s->q2);
        //弹出栈顶元素
        QPop(s->q2);
    }
    else
    {   //把队列中的数据放在另一个队列中,只剩一个,还剩的一个就是栈顶元素
        while (GetQueuelen(s->q1)>1)
        {
            QPush(s->q2,*GetFront(s->q1));
            QPop(s->q1);
        }
        //获取栈顶元素
        s->data=*GetFront(s->q1);
        //弹出栈顶元素
        QPop(s->q1);
    }
    return &s->data;
}

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了用栈实现队列和队列实现栈的方法,望指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值