力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台//循环队列
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台//栈队列
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台//队列栈
循环队列:
与普通队列相比,循环队列的优势通过一个静态数组来实现大量的数据插入和删除
如图所示,通常循环队列的基本属性有队头、队尾、有效元素个数三部分构成,我们分别用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
队列栈:
队列栈相比于栈队列就显得相对麻烦,因为如果有两个队列,无论经过多少次的交换,它们中的元素顺序始终没有变,所以我们需要在此上加以改进
法:开辟两个空队列,随机挑选一个队列进入队操作,入队完毕后将此队列的队尾之前元素全部导入到另一个队列,再将队尾元素给取出作为出栈的首元素;而后再见第二个队列的队尾之前元素导入到第一个队列,去除队尾元素作为出栈的次元素;以此循环直到两个队列均为空则目标完成