题目:
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。

循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。

你的实现应该支持如下操作:

MyCircularQueue(k): 构造器,设置队列长度为 k 。
Front: 从队首获取元素。如果队列为空,返回 -1 。
Rear: 获取队尾元素。如果队列为空,返回 -1 。
enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
isEmpty(): 检查循环队列是否为空。
isFull(): 检查循环队列是否已满。


解题思路:

关于循环队列的实现我们可以用数组来实现,把数组抽象想象成卷起来的,如图:
实现循环的关键点有两个:

  1. 判断数组是否满的方法用:浪费一个数组格子,判断rear的下一个是否是front,具体方法使,用下面公式
  2. 如果数组大小是8,此时最后一个元素下标是7,要想放元素到下一个循环的第一个空间中,关键就是公式的推导
  3. 这里我们使用的公式是 :(rear+1)% elem.length
  4. (7+1)%8=0;这样就实现了7下标的下一个下标是0,实现了队列的循环
  5. 具体代码实现如下:
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. 设计循环队列 (有关实现循环队列的讲解)相关推荐

  1. leetcode 622——设计循环队列

    leetcode 622--设计循环队列(C语言提交) 题目链接:leetcode 622--设计循环队列 题目描述: 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先 ...

  2. Leetcode 622. 设计循环队列

    Leetcode 622. 设计循环队列学习 分析 代码 参考链接 分析 循环队列,自己做题时没考虑怎么实现,可以通过索引下标除以数组的长度实现循环.循环队列的队首元素和队尾元素是动态变化的,删除一个 ...

  3. Java实现 LeetCode 622 设计循环队列(暴力大法)

    622. 设计循环队列 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为"环形缓冲器" ...

  4. c++数据结构中 顺序队列的队首队尾_yiduobo的每日leetcode 622.设计循环队列

    祖传的手艺不想丢了,所以按顺序写一个leetcode的题解.计划每日两题,争取不卡题吧. 622.设计循环队列https://leetcode-cn.com/problems/design-circu ...

  5. Leetcode 622. 设计循环队列 解题思路及C++实现

    解题思路: 使用整数数组来作为队列的数据结构,设置两个位置指针:front 和 end,front指向队首元素,end指向队尾的下一个元素(即为空位置).当 front 和 end 相等时,有两种情况 ...

  6. LeetCode 641. 设计循环双端队列

    文章目录 1. 题目信息 2. 解题 1. 题目信息 设计实现双端队列. 你的实现需要支持以下操作: MyCircularDeque(k):构造函数,双端队列的大小为k. insertFront(): ...

  7. leetcode 622. Design Circular Queue | 641. 设计循环双端队列(Java)

    题目 https://leetcode.com/problems/design-circular-deque/ 题解 相关问题:leetcode 622. Design Circular Queue ...

  8. 【LeetCode 622 链表专项】设计循环队列

    文章目录 1. 题目 1.1 示例 1.2 说明 1.3 限制 2. 解法一(基于数组) 2.1 分析 2.2 解答 2.3 复杂度 2.4 代码优化 3. 解法二(基于链表) 3.1 分析 3.2 ...

  9. 设计循环队列(LeetCode:622.设计循环队列)

    目录 写在前面的话: 一,题目分析 二,各接口实现 2.1构造循环队列 2.1.1两种不同形式的队列 2.1.2顺序表实现循环队列 2.2向队列中插入元素 2.3删除队列中元素 2.4获取队尾和队首元 ...

最新文章

  1. 机器学习中训练集、验证集和测试集的区别
  2. python可以干嘛知乎-一行Python代码能做什么?
  3. 冷却负载、人为因素影响传统数据中心效率
  4. 用ABAP来实现柱状图和饼状图的输出
  5. excel2003 java_java 读取 excel 2003 或 excel 2007
  6. 无法初始化java类_myeclip运行java程序不能初始化类 NoClassDefFoundError
  7. 信息学奥赛一本通(1244:和为给定数)
  8. NAS: One-Shot
  9. GNN手绘草图识别新架构:Multi-Graph Transformer 网络
  10. Vue深入学习2—虚拟DOM和Diff算法
  11. 使用组合改进软件测试用例的生成2
  12. 万能电子狗升级工具_HUD抬头显示,车萝卜再推新品,屏幕全新升级
  13. matlab hamming 原理,Matlab中加汉明窗 ahmming 作用
  14. 浏览器刷新和关闭时显示提示信息
  15. 使用Xcode真机调试时没有任何问题,但是当打包成ipa文件安装时,有接口访问不到后台信息
  16. java 代码实现加锁_java内置锁实现锁住代码块方案(同一个对象或锁住整个类.class)...
  17. 微信小程序 富文本 换行问题 文本溢出使用省略号
  18. 深度学习实例第四部分:PaddlePaddle
  19. 冒泡算法(BubbleSort)
  20. Matlab 激活,反激活

热门文章

  1. Spring基础专题——第五章(Aop代理)
  2. python之互斥锁
  3. Linux 内核测试版与稳定版的版本号有什么不同?
  4. 3D视觉检测的未来:光度立体技术
  5. gcc和g++是什么,有什么区别?
  6. 用于语义分割的特征共享协作网络
  7. zabbix3.4.7版本饼图显示问题
  8. CUDA FORTRAN编译器
  9. Nginx搭建静态网站
  10. Mac OS X的快捷键