【Java】 LeetCode 622. 设计循环队列 (有关实现循环队列的讲解)
题目:
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
你的实现应该支持如下操作:
MyCircularQueue(k): 构造器,设置队列长度为 k 。
Front: 从队首获取元素。如果队列为空,返回 -1 。
Rear: 获取队尾元素。如果队列为空,返回 -1 。
enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
isEmpty(): 检查循环队列是否为空。
isFull(): 检查循环队列是否已满。
解题思路:
关于循环队列的实现我们可以用数组来实现,把数组抽象想象成卷起来的,如图:
实现循环的关键点有两个:
- 判断数组是否满的方法用:浪费一个数组格子,判断rear的下一个是否是front,具体方法使,用下面公式
- 如果数组大小是8,此时最后一个元素下标是7,要想放元素到下一个循环的第一个空间中,关键就是公式的推导
- 这里我们使用的公式是 :(rear+1)% elem.length
- (7+1)%8=0;这样就实现了7下标的下一个下标是0,实现了队列的循环
- 具体代码实现如下:
class MyCircularQueue {public int[] elem;public int front; //队头public int rear; //队尾public MyCircularQueue(int k) {this.elem=new int[k+1]; //因为我们的队列设计是牺牲一个空间的设计,给8最多能放7个元素,所以new时候大小就需要多出一个 也就是k+1 }public boolean enQueue(int value) {if (isFull()){return false;}this.elem[rear]=value;rear=(rear+1)%elem.length; //下标查找使用公式return true;}public boolean deQueue() {if (isEmpty()) return false;front=(front+1)%elem.length;return true;}public int Front() {if (isEmpty()){return -1;}return elem[front];}public int Rear() {if (isEmpty()){return -1;}int index=-1;if (rear==0){index=elem.length-1; //如果rear在0位置,需要的元素在上一个循环末尾,下标也就是数组长度-1}else { index=rear-1; //元素位置就是数组对应下标}return elem[index];}public boolean isEmpty() {return this.front==this.rear; //front==rear说明此时数组为空}public boolean isFull() {if ((rear+1)%elem.length==front){return true; //公式计算的结果为0就说明满了}return false;}
}
【Java】 LeetCode 622. 设计循环队列 (有关实现循环队列的讲解)相关推荐
- leetcode 622——设计循环队列
leetcode 622--设计循环队列(C语言提交) 题目链接:leetcode 622--设计循环队列 题目描述: 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先 ...
- Leetcode 622. 设计循环队列
Leetcode 622. 设计循环队列学习 分析 代码 参考链接 分析 循环队列,自己做题时没考虑怎么实现,可以通过索引下标除以数组的长度实现循环.循环队列的队首元素和队尾元素是动态变化的,删除一个 ...
- Java实现 LeetCode 622 设计循环队列(暴力大法)
622. 设计循环队列 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为"环形缓冲器" ...
- c++数据结构中 顺序队列的队首队尾_yiduobo的每日leetcode 622.设计循环队列
祖传的手艺不想丢了,所以按顺序写一个leetcode的题解.计划每日两题,争取不卡题吧. 622.设计循环队列https://leetcode-cn.com/problems/design-circu ...
- Leetcode 622. 设计循环队列 解题思路及C++实现
解题思路: 使用整数数组来作为队列的数据结构,设置两个位置指针:front 和 end,front指向队首元素,end指向队尾的下一个元素(即为空位置).当 front 和 end 相等时,有两种情况 ...
- LeetCode 641. 设计循环双端队列
文章目录 1. 题目信息 2. 解题 1. 题目信息 设计实现双端队列. 你的实现需要支持以下操作: MyCircularDeque(k):构造函数,双端队列的大小为k. insertFront(): ...
- leetcode 622. Design Circular Queue | 641. 设计循环双端队列(Java)
题目 https://leetcode.com/problems/design-circular-deque/ 题解 相关问题:leetcode 622. Design Circular Queue ...
- 【LeetCode 622 链表专项】设计循环队列
文章目录 1. 题目 1.1 示例 1.2 说明 1.3 限制 2. 解法一(基于数组) 2.1 分析 2.2 解答 2.3 复杂度 2.4 代码优化 3. 解法二(基于链表) 3.1 分析 3.2 ...
- 设计循环队列(LeetCode:622.设计循环队列)
目录 写在前面的话: 一,题目分析 二,各接口实现 2.1构造循环队列 2.1.1两种不同形式的队列 2.1.2顺序表实现循环队列 2.2向队列中插入元素 2.3删除队列中元素 2.4获取队尾和队首元 ...
最新文章
- 机器学习中训练集、验证集和测试集的区别
- python可以干嘛知乎-一行Python代码能做什么?
- 冷却负载、人为因素影响传统数据中心效率
- 用ABAP来实现柱状图和饼状图的输出
- excel2003 java_java 读取 excel 2003 或 excel 2007
- 无法初始化java类_myeclip运行java程序不能初始化类 NoClassDefFoundError
- 信息学奥赛一本通(1244:和为给定数)
- NAS: One-Shot
- GNN手绘草图识别新架构:Multi-Graph Transformer 网络
- Vue深入学习2—虚拟DOM和Diff算法
- 使用组合改进软件测试用例的生成2
- 万能电子狗升级工具_HUD抬头显示,车萝卜再推新品,屏幕全新升级
- matlab hamming 原理,Matlab中加汉明窗 ahmming 作用
- 浏览器刷新和关闭时显示提示信息
- 使用Xcode真机调试时没有任何问题,但是当打包成ipa文件安装时,有接口访问不到后台信息
- java 代码实现加锁_java内置锁实现锁住代码块方案(同一个对象或锁住整个类.class)...
- 微信小程序 富文本 换行问题 文本溢出使用省略号
- 深度学习实例第四部分:PaddlePaddle
- 冒泡算法(BubbleSort)
- Matlab 激活,反激活