当前位置: 首页 > news >正文

【数据结构】环形队列

环形队列

1. 定义

环形队列就是将队列在逻辑上看作环形结构、物理上仍是数组形式存储的一种数据结构。

其实现主要分为两种情况:

  1. 浪费空间法
  2. 记录空间法

2. 实现

实现要考虑的是成员变量

2.1 记录空间法

使用used标识当前存储了多少元素,如果为空,那么就将head移到0位置处,如果满了,那么就将tail移到0位置处
在这里插入图片描述

1. 入队

队列是从队尾入,队头出,所以就是在tail的位置入队,每入一个元素就将tail++,当满的时候就将tail恢复到队头。

普通情况:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

队列满了:在这里插入图片描述

这时就需要tail=0,等待某个时候有元素出队,这个时候新插入的元素就又能在tail的位置进行插入。在这里插入图片描述


出队操作与入队操作对称,同理。

2. 代码实现
package MyCircleQueue;public class CircleQueue {int size = 5;// 队列最大容量int used = 0;// 队列已使用元素int[] data = new int[size];// 存储队列数据int tail = 0, head = 0;// 队列头尾指针public void offer(int val) {// 满了if (used == size) {tail = 0;System.out.println("满了");return;}// 没满data[tail++] = val;used++;System.out.println("存入"+val);}public int poll() {if (used == 0) {head = 0;System.out.println("空了");return -1;}int ret = data[head++];used--;System.out.println("取出:"+ret);return ret;}
}

2.2 浪费空间法

在这种方式中,我们只使用头尾两个指针进行计算,并将 head = tail 的情况记作空,将 (tail+1)%size = head 的情况记作满

2.2.1实现代码:
package MyCircleQueue;public class CircleQueue2 {int size = 5;int[] data = new int[size];int head= 0, tail = 0;public void offer(int val) {if ((tail+1) % size == head) {System.out.println("满了");return;}data[tail++] = val;System.out.println("入队:"+val);}public int poll() {if (head == tail) {System.out.println("空了");return -1;}int ret = data[head++];System.out.println("出队:"+ret);return ret;}
}

3. 测试代码:

package MyCircleQueue;public class Test {public static void main(String[] args) {CircleQueue queue = new CircleQueue();for (int i = 0; i < 10; i++) {queue.offer(i);}for (int i = 0; i < 10; i++) {int ret = queue.poll();}}
}

4. 结论

环形队列分为两种实现方式:

方法满的标记空的标记
浪费空间法(tail+1)%size == headhead == tail
标记长度法used == sizeused == 0

其中推荐使用标记长度法。

http://www.lryc.cn/news/253140.html

相关文章:

  • 嵌入式C编码规范
  • Golang 并发 — 流水线
  • Elasticsearch:什么是非结构化数据?
  • 15:00的面试,15:06就出来了,问的问题过于变态了。。。
  • Web自动化测试怎么做?Web网页测试全流程解析
  • MySQL数据库SQLSTATE[22007]: Invalid datetime format 日期类型不能为空值的解决办法
  • 搬运工让你分分钟了解Web接口测试
  • 作业12.5
  • leetCode 47. 全排列 II + 回溯算法 + 图解 + 笔记
  • Maya 2024(3D建模、动画和渲染软件)
  • C++作业5
  • Go语言很难吗?为什么 Go 岗位这么少?
  • 为什么要替换 Object.defineProperty?
  • 百马百担c语言编程
  • C++检测字符串中有效的括号个数
  • 前端依赖下载速度过慢解决方法,nrm 镜像管理工具
  • 如何为 3D 模型制作纹理的最佳方法
  • 智慧校园:TSINGSEE青犀智能视频监控系统,AI助力优化校园管理
  • Three的lod技术
  • Git配置
  • 阻抗控制下机器人接触刚性环境振荡不稳定进行阻抗调节
  • 【鸿蒙应用ArkTS开发系列】-自定义底部菜单列表弹窗
  • yolov8添加ca注意力机制
  • linux java后台启动的几种方式
  • selinux-policy-default(2:2.20231119-2)软件包内容详细介绍(5)
  • 代码随想录二刷 |栈与队列 |理论基础
  • java--接口概述
  • 出海风潮:中国母婴品牌征服国际市场的机遇与挑战!
  • 一文读懂MongoDB的知识点(3),惊呆面试官。
  • ssm的“魅力”西安宣传网站(有报告)。Javaee项目。