【数据结构与算法 2】循环队列

数据结构——循环队列详解 队列主要有顺序队列,循环队列,双端队列,优先队列。而当中循环队列是一种线性数据结构。它也被称为“环形缓冲器”。它只允许在一端进行插入操作,即队尾(rear),而在另一端进行删除操作,即队头 (front),其操作表现基于FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。向队列中插入新的数据元素称为入队,新入队的元素就成为了队列的队尾元素。循环队列允许元素在队尾插入,在队头删除,同时遵循先进先出原则。由于循环队列是基于数组实现的,所以它的访问速度很快,特别是在移动元素时。 阅读详情

一、队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。

进行插入操作的端称为队尾,进行删除操作的端称为队头。

队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。

二、循环队列

在实际使用队列时,为了使队列空间能重复使用,往往对队列的使用方法稍加改进:无论插入或删除,一旦rear指针增1或front指针增1 时超出了所分配的队列空间,就让它指向这片连续空间的起始位置。自己真从MaxSize-1增1变到0,可用取余运算rear%MaxSize和front%MaxSize来实现。这实际上是把队列空间想象成一个环形空间,环形空间中的存储单元循环使用,用这种方法管理的队列也就称为循环队列。除了一些简单应用之外,真正实用的队列是循环队列。

在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满时,也有front=rear。为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件时front=rear,而队列判满的条件时front=(rear+1)%MaxSize。队空和队满的情况如图:

三、代码实例

CircleArray

package com.atguigu.queue;

public class CircleArray {
	private int maxSize;
	private int front;//队列头
	private int rear;//队列尾
	private int[] arr;//该数组用于存放数据,模拟队列
	
	public CircleArray(int arrMaxSize) {
		maxSize = arrMaxSize;
		arr = new int[maxSize];
	}
	
	//判断队列是否满
	public boolean isFull() {
		return (rear+1) % maxSize == front;
	}
	
	//判断队列是否为空
	public boolean isEmpty() {
		return rear == front;
	}
	
	//添加数据到队列
	public void addQueue(int n) {
		//判断队列是否满
		if(isFull()) {
			System.out.println("判断队列满");
			return;
		}
		//直接将数据加入
		arr[rear] = n;
		//将rear后移,必须考虑取模
		rear = (rear+1)%maxSize;
	}
	
	//出队列
	public int getQueue() {
		//判断队列是否空
		if(isEmpty()) {
			//通过抛出异常
			throw new RuntimeException("队列空,不能取数据");
		}
		//这里需要分析出front是指向队列的第一个元素
		//1、先把front对应的值保存到一个临时变量
		//2、将front后移,考虑取模
		//3、将临时保存的变量返回
		int value = arr[front];
		front = (front+1)%maxSize;
		return value;
	}
	
	//显示队列的所有数据
	public void showQueue() {
		if(isEmpty()) {
			//通过抛出异常
			throw new RuntimeException("队列空,不能取数据");
		}
		//思路:从front开始遍历,遍历多少个元素
		//动脑筋
		for(int i = front;i<front+size();i++) {
			System.out.printf("arr[%d]=%d\n",i % maxSize,arr[i % maxSize]);
		}
	}
	
	//求出当前队列有效数据的个数
	public int size() {
		// rear = 1 
		// front = 0
		// maxSize = 3
		return (rear+maxSize-front)%maxSize;
	}
	
	//显示队列的头数据,注意不是取出数据
	public int headQueue() {
		if(isEmpty()) {
			//通过抛出异常
			throw new RuntimeException("队列空,不能取数据");
		}
		return arr[front];
	}
}

CircleArrayQueueTest 

package com.atguigu.queue;

import java.util.Scanner;

public class CircleArrayQueueDemo {
	public static void main(String[] args) {
		System.out.println("测试模拟环形队列");
		//创建一个队列
		CircleArray arrayQueue = new CircleArray(4);
		char key = ' ';//接收数据输入
		Scanner scanner = new Scanner(System.in);
		boolean loop = true;
		//输出一个菜单
		while(loop) {
			System.out.println("s(show):显示队列");
			System.out.println("e(exit):退出队列");
			System.out.println("a(add):添加数据到队列");
			System.out.println("g(get):从队列取出数据");
			System.out.println("h(head):查出队列头的数据");
			key = scanner.next().charAt(0);
			switch(key) {
				case 's':
					arrayQueue.showQueue();
					break;
				case 'a':
					System.out.println("输出一个数");
					int value = scanner.nextInt();
					arrayQueue.addQueue(value);
					break;
				case 'g':
					try {
						int res = arrayQueue.getQueue();
						System.out.printf("取出的数据是%d\n",res);
					}catch(Exception e) {
						System.out.println(e.getMessage());
					}
					break;
				case 'h':
					try {
						int res = arrayQueue.headQueue();
						System.out.printf("查出队列头的数据是%d\n",res);
					}catch(Exception e) {
						System.out.println(e.getMessage());
					}
					break;
				case 'e':
					scanner.close();
					loop = false;
					break;
				default :
			}
		}
		System.out.println("程序退出");
	}
}

四、控制台输出

【数据结构】循环队列 队列又称为"先进先出(FIFO)"线性表:插入操作只能在队尾进行,删除操作只能在队首进行。而循环队列是队列的一种特殊形式,循环队列(也被称为环形队列)是一种线性数据结构,其操作表现基于先进先出原则,并且队尾被连接在队首之后以形成一个循环。循环队列固定大小,空间能够重复利用。循环队列可以用数组或者链表实现,那下面我们来分析一下哪种方式更好:当我们想使用链表实现时,假设我们想要开辟的队列长度为k = 4;front表示队头指针,rear表示队尾指针:由上图可知,当rear和front 都指向同一个位置时队列为空 阅读详情

相关推荐

Leetcode:662.Design Circular Queue 设计循环队列

Design Circular Queue 设计循环队列 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存...

Coding 1208

循环队列详解

简单易懂的循环队列

weixin_55858644的博客 4万+

手把手调试AD9653的LVDS数据采集:从VIO抓波形到用F0/F8帧对齐的实战心得

本文详细介绍了AD9653高速ADC与Xilinx 7系列FPGA(如7z035)的LVDS数据采集调试实战经验。从硬件环境搭建、Vivado工具链配置到LVDS数据对齐技巧,重点分享了利用VIO抓取波形和使用F0/F8帧对齐的实用方法,帮助工程师快速解决高速数据采集系统中的信号完整性问题。

weixin_29169899的博客 701

【数据结构】队列——循环队列(详解)

0 循环队列循环队列(Circular Queue)是队列的一种实现方式,它通过将队列存储空间的最后一个位置与第一个位置相连接,形成一个循环的队列结构,从而可以更加高效地利用存储空间。在循环队列中,当队尾指针到达队列存储空间的末尾时,下一个插入操作将从头开始,即实现了队列的“循环”。1 特定条件下循环队列队/空队满判断条件在循环队列中,判断队列是否为空或已满是一个重要的操作。由于循环队列的特性,我们不能简单地通过比较队头指针(front)和队尾指针(rear。

2201_75425839的博客 1万+

MIA文献阅读 —— 深度学习在医学图像分析中的最新进展及临床应用【2024】_再现性;深度学习

coderVAEVAEVAE) (Kingma威林,2014)在概率性的工作方式学习观测数据之间的映射空间x∈Rmx∈R^mx∈Rm 和潜在的空间z∈Rnmnz∈Rn(m>>n)。作为一个潜变量模型,VAEVAEVAE制定这个问题作为观察样品的最大化对数似logpxlog∫px∣zpzdzpx∣zp (x | z)p(x∣z)可以很容易地使用神经网络建模,和pzp (z)

2401_84181704的博客 1242

卷王问卷考试系统——测试报告

本问卷考试系统是一款在线平台,支持用户发布和完成调查问卷,并进行考试管理,核心功能在于简化问卷创建发布、数据收集及考试组织流程。此次测试将围绕其关键模块展开,涵盖用户注册登录、项目列表、我的练习以及我的题库等核心部分。问卷考试系统(一)硬件环境普通办公电脑(CPU:Intel i5 、内存:16GB 、硬盘:512GB )(二)软件环境操作系统:Windows 11 ;浏览器:Chrome(版本 120+)、Firefox(版本 115+)、Edge(版本 120+)验证界面信息在完整性、一致性、准确性和用

m0_73433755的博客 552

数据结构和算法——基于Java——2.2 循环队列

数据结构和算法——基于Java——2.2 循环队列

G_change_的博客 201

基于AutoDL复现A-LOAM

Ceres solver 是谷歌开发的一款用于非线性优化的库,在谷歌的开源激光雷达slam项目cartographer中被大量使用。在autodl上面租服务器,地区我租的重庆A区的,GPU我选择的是RTX4090,基础镜像选择的是Miniconda / conda3 / 3.8(ubuntu20.04)/11.6。在AutoDL中我使用的方式是先将该数据集先下载到自己的电脑上,然后再上传到虚拟机中。用MobaXterm解决该问题!搜到的一个解决方式:该问题属于ceres版本问题,将A-LOAM下的。

m0_61281610的博客 1942

【数据结构与算法】2.2 数组实现循环队列思路、代码

package com.hblg.queue; import java.util.Scanner; import java.util.concurrent.ForkJoinPool; /** * @author i * @create 2019/9/9 19:19 * @Description 用数组实现环形队列的思路整理 * 环形队列结构分析: * 我们可以...

芝兰生于深谷,不以无人而不芳 614

西门子PLC新手必看:200SMART与1200/1500的MODBUS RTU通讯实战(附完整配置流程)

本文详细解析了西门子PLC中S7-200 SMART与S7-1200/1500之间实现MODBUS RTU通讯的完整实战流程。内容涵盖硬件接线、软件配置及程序编写,重点讲解了200SMART作为从站、1200/1500作为主站的典型架构,并提供了关键功能块的使用方法和常见问题排查技巧,帮助新手快速打通不同系列PLC间的数据交换。

weixin_29214559的博客 393

2026基金本子新规必看!聚焦四大底层问题,利用AI辅助分别破解提升中标率

我拟申报的研究主题为【明确的研究主题或关键词组合】。选题方向也是评审专家关注的核心之一,申报前可以检索近五年领域前人中标项目,分析现有研究的空白与不足,并结合自身研究基础选择 “人无我有、人有我优” 的细分方向,如果是交叉学科选题,则要阐述不同学科的融合逻辑与创新点。“推动国家战略”、“带来行业发展”等宏观表述,有很多同仁都喜欢用这类话术开篇,但实际上宏大叙事无法替代具体的真实科学问题,明确不了研究要解决的核心痛点,更没有说明问题的现实针对性,评审看了往往抓不到研究的核心价值。

智能AI让学术科研更容易 294

数据结构与算法-1.2用数组实现循环队列

package com.mytest.controller; import java.util.Arrays; public class Demo02 { public static int[] array = new int[10]; public static void main(String[] args) { Queue queue = new Q...

BayMax_0X0001的博客 278

华为OD机考双机位C卷 - 斗地主之顺子 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 斗地主之顺子(OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 9692

数据结构与算法2:用队列实现栈 +循环队列

这里写目录标题用队列实现栈循环队列 用队列实现栈 当要弹出元素3 时 必须先弹出元素1 并将1 添加到queueB中,再弹出元素2 将2 添加到queueB的元素1 后面queueB中的元素顺序为1,2 此时若想添加元素4 则直接在queueB中添加即可。 与用栈实现队列不同的是queueA和QueueB 交替使用(因为顺序未发生改变) import p1.接口.Stack; import java.util.Iterator; public class QueueToStack {

weixin_45984258的博客 557

组合预测模型 | LSTM-XGBoost长短期记忆神经网络结合极限梯度提升树时间序列预测(Matlab程序)

组合预测模型 | LSTM-XGBoost长短期记忆神经网络结合极限梯度提升树时间序列预测(Matlab完整程序)

前程算法屋的博客 2179

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

数据结构与算法(3-2)队列(顺序队列、循环队列与链队列)

目录 一、顺序队列 1、存储结构 2、入队和出队 一、顺序队列 队列特征:先进后出、后进后出。 1、存储结构 //队列 typedef struct { int data[MAXSIZE]; int front; int rear; }SqQueue; SqQueue Q; 2、入队和出队 入队:从队尾放入元素,rear++ 出队:从队首取出元素,front++ 总代码 //顺序队列 //主要用front和rear分别指向队首和队尾 //进栈时:...

great_yzl的博客 821

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【数据结构与算法】栈和队列的综合应用:1.用栈实现队列 2.用队列实现栈 3.设计循环队列

本文介绍了栈和队列的相互实现方法及循环队列的设计原理。通过双栈模拟队列实现"先进先出"特性,利用双队列保持一个队列为空的方式实现栈的"后进先出"特性。文中提供了完整的C语言实现代码,包括栈/队列的基本操作函数,以及两种数据结构相互转换的核心算法。最后还讲解了循环队列的环形缓冲区实现方式,通过维护头尾指针和判空/满标志来优化空间利用率。这些经典问题考察了对线性表特性的深入理解和灵活运用能力,是数据结构学习的重要实践案例。

小龙报的博客 638

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

leetcode摸鱼学习:循环队列

3月2日 因为想刷题却发现算法和数据结构学的一塌糊涂,所以索性回来重新学习一遍; 话不多说,上内容 这是设计要求 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素...

Z3Djoker的博客 234

数据结构(c语言版 第2版)第3章栈和队列算法设计题(循环队列基本操作)

数据结构(c语言版 第2版)第3章栈和队列算法设计题(循环队列基本操作)

Xwylovexixi的博客 379

数据结构与算法基本概念中易错习题

1.下述()与数据的存储结构无关。 A.栈 B.双向链表 C.散列表 D.线索树 E.循环队列 答案:A 解析: 选项A,栈是逻辑结构。 选项B,双向链表也说明线性表是以链式结构存储的。 选项C,散列是算法,散列存储方法本质上是顺序存储方法的扩展。散列表本质上是顺序表的扩展。 选项D,线索树是在链式存储结构的基础上对树进行线索,与链式存储结构有关。 选项E,循环队列是建立在顺序存储结构上的。 2.以下属于逻辑结构的是( )。 A.顺序表 B.散列表 C.有序表 D.单链表 答案:C 解析: 本题考查数据的物

#两个西柚 579

计算机二级公共基础知识:数据结构与算法+错题

若循环队列的存储空间为(1:m),在循环队列运转起来后,如果font<rear,则队列中的元素个数为rear-ftont;设顺序表长度为n,最坏情况下比较次数:坏情况下比较次数:堆排序为nlog2n,冒泡、简单插入、简单选择、快速排序为n(n-1)/2,顺序查找为n,寻找最大项为n-1,有序表对分查找log2n。多重链表,就是链表里的结点可能隶属多个链表,最常见的就是十字链表,每个结点都有多个指针域,对应于多个链表嘛,但是反过来说,拥有多个指针域的结点的链表就是多重链表是不准确的,因为。

weixin_57235321的博客 636

栈和队列都是限制存取点的线性结构_考前押题:数据结构与算法

1.考前密押试题对长度为n的线性表排序,在最坏情况下,比较次数不是n(n-1)/2的排序方法是答案:AA)堆排序B)冒泡排序C)快速排序D)直接插入排序2.考前密押试题下列关于栈的叙述正确的是A)栈按"先进后出"组织数据B)栈按"先进先出"组织数据C)不能删除数据D)只能在栈底插入数据3.考前密押试题某二叉树有5个度为2的结点,则该二叉树中的叶子结点数是答案:DA)4B)8C)10...

weixin_39733821的博客 596

苏州大学 算法与数据结构

1算法与数据结构(部分题目) 下面叙述正确的是()。 算法的执行效率与数据的存储结构无关 空间复杂度是指算法程序中指令(或语句)的条数 算法的有穷性是指算法必须能在执行有限个步骤之后终止 以上三种描述都不对 参考答案:C 试题评析: 算法的设计可以避开具体的计算机程序设计语言,但算法的实现必须借助程序设计语言中提供的数据类型及其算法。数据结构和算法是计算机科学的两个重要支柱。它们是一个不可分割的整体。算法在运行过程中需辅助存储空间的大小称为算法的空间复杂度。算法的有穷性是指一个算法必须在执行有限

weixin_45686244的博客 1267

数据结构 第1章 绪论

思维导图+题目

to_upper的博客 660
上一篇: 【程序猿历程】Java架构师学习路线(初级)
下一篇: 【数据结构与算法 3】单链表
哪 吒
哪 吒 2022年度博客之星TOP 1 2022年度博客之星TOP 1 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 59万+粉丝 2933原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值