1.学习内容:
今天 我们讲解一道能够很好的总结所学队列知识的题目---设计循环队列
622. 设计循环队列 - 力扣(LeetCode)
2.题目描述:
让我们设计一个队列 要求是循环的 这和我们的双向链表有些类似
让我们按要求设计出这些相对应函数
此题目特殊之处在于 “满了就不能再插入”,“循环如何判断满和空”圈起来后面要用到
3. 题目思路:
为了解决以上问题 我们要先设计我们的解题思路
设计循环队列,那我们是选择用数组处理还是选择用链表处理呢? 为什么?
先给答案: 建议用数组
为什么: 首先我们用front指向头 back指向队尾的下一个 使用链表确实可以在判断为空为满部分很快捷 我们只需要判断back->next 是否等于 front即可 但是唯独在取队尾时不方便 这时候我们可以选择采用双向链表 或者增加一个back->prev的指针来表示上一个 但哪怕是采用双向链表 对于我们来说依旧不是很友好 我们还需要新建节点 释放等等 在难度上和数组大差不差 所以我们还是选择数组来解决
首先,我们要解决一开始提到的问题------“满了就不能再插入”,“循环如何判断满和空”
我们有两种解决方案
先上示意图
1. 采用size 新增加一个size size==0时 也就是front==back为空 size != 0 就是满
2.采用新开辟一个空间 因为我们使back指向队尾的下一个 所以每次赋值后++back
所以当 (back+1)% (k+1) == front 时就是满的情况 黄色位置就表示插入满后back的指向
此时就可以完美解决无法判断满和空的区别
接下来我们解决其他函数:插入和删除
首先进行插入判断: 为空不能插入 返回false back指向下一个位置++
核心: 当我的back小于我开辟的k+1个空间时 怎么%取的都是back的下标
但当他满了的时候 需要让他的下标重新返回0 所以 obj->back %= (obj->k+1);是专门为返回原下标也就是他满了的时候准备的 同理 front也一样 不进行二次赘述
第三重点:返回rear
有两种表示方法 上面的很好理解 就是back为空或者满直接返回队尾元素
重点是下面的
这个表示相当于在原先back满了要循环的情况下 不进行循环 直接在后面添加
也就是back为0的情况下 当back为0 back-1就代表数组下标越界
这个时候为他加上我的空间长度 k+1 再%k+1 就可以返回任意情况 包括front不在第一位
因为如果back没满时 back-1 % k+1 就会直接返回back-1
而 back == 0 k+1就发挥作用了
以上就是本题的大致讲解 下面将附下全代码仅供参考