栈队列,队列栈,循环队列

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台//循环队列

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台//栈队列

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台//队列栈

 

循环队列:

与普通队列相比,循环队列的优势通过一个静态数组来实现大量的数据插入和删除

290fc83e0f6e43d296d4e9fcf9a54fd8.png

如图所示,通常循环队列的基本属性有队头、队尾、有效元素个数三部分构成,我们分别用front,rear,k三个变量来表示它们

先来讨论最极端的情况

1、空队列,默认front和rear值相同

2、满队列,我们规定如果静态数组的总长度为N,我们最多只能存储N-1个数据,剩下来一个空间用来方便插入数据和判空

        数字表达式判空 (rear+1)%(k+1)==front

 这里格外注意取模这个小技巧,由于数组不像链表一样能够自由首尾相连,因此当rear走到最后一格的时候如果再+1那么必然会出现数组越界的行为,故而需要取模来让rear回到0下标处。

3、入队和出队

        有了对基本队列的操作理解,那么在这一步就显得非常简单了,可以说是没有什么技术含量,入队arr[rear++]=value;出队front++。But,这里两个变量走的时候同样需要取模来防止报错。

 

栈队列:

 

顾名思义,就是通过栈的方式来模拟实现队列。我们需要给定两个栈结构体,一个栈模拟入队,一个栈模拟出队,分别用pushstack和popstack来表示。

根据栈先入后出的特性,易得当所有元素入栈存储到pushstack后再出栈存储到popstack中,就得到了与入栈前相反得顺序,此时popstack的栈顶元素即我们需要的队头

再将popstack的所有元素意义取出就实现了目标

 

注意点:当popstack中还存在元素时如果我们进行入队操作,一定要把popstack中元素全部出栈后才能再将pushstack中的值导入到popstack

 

队列栈:

队列栈相比于栈队列就显得相对麻烦,因为如果有两个队列,无论经过多少次的交换,它们中的元素顺序始终没有变,所以我们需要在此上加以改进

法:开辟两个空队列,随机挑选一个队列进入队操作,入队完毕后将此队列的队尾之前元素全部导入到另一个队列,再将队尾元素给取出作为出栈的首元素;而后再见第二个队列的队尾之前元素导入到第一个队列,去除队尾元素作为出栈的次元素;以此循环直到两个队列均为空则目标完成

      

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shall#

你的鼓励将是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值