环形队列的实现

article/2025/9/28 0:23:37

首先我们先来了解一下队列是什么?

队列:数据先入先出,后进后出(与栈刚好相反),主要通过数组实现。需要通过两个指针来创建对应的队列;一个指针为前缀pre,一个指针为后缀rear。pre指针指向先进来的数的前面,rear指针指向数组的加入数,即有数据的末尾,以此来判断加入的数组是否已满。(我们这个pre指针指向的是首个数据的前面(要保证先进先出,就得要有个指针指向数据的第一个),而rear指向的是数据中的最后一个数据)

 

这是我对于队列的总结,但这只是普通队列,该种方式实现的队列只能使用一次(大家有兴趣可以去实现一下这个普通队列);如果要做到循环使用,那我们就要实现环形队列

环形队列通过取模的方法实现环形队列,需要空出一个空间容量作为约定,此时pre指向的是先进来的数,rear为最后一个元素的后一个位置。此时(rear+1)% maxSize==front(满),rear==front(空)。下图是尚硅谷韩顺平老师对于环形队列的分析,我觉得很形象,图中的MaxSize-1为预留出的空间,我们需要一个预留的空间以达到循环的目的,即我们对于这个空间不操作,用于循环递换。

图中的得到有效数据的个数的公式,为什么加maxSize韩老师没有具体讲,我总结为+maxSize的原因是怕rear-front出现负数,此时无法取模,故加maxSize。

如果对于上图还不是很明白的,我附上代码实现,大家应该就懂了,如果还有不理解的,可以在评论区留言,我会及时回复解答的。

package com.liu.Array;/*** @author lwx* @create 2021-09-06 21:17*/
public class CircleQueue {private int pre;//指向先进来的数private int rear;//指向数据末尾的下一位private int[] queue;//队列private int maxSize;//队列的长度public static void main(String[] args) {CircleQueue circleQueue = new CircleQueue(10);circleQueue.addQueue(2);circleQueue.addQueue(4);circleQueue.addQueue(5);circleQueue.addQueue(8);circleQueue.addQueue(10);circleQueue.addQueue(10);circleQueue.addQueue(10);circleQueue.addQueue(10);circleQueue.addQueue(10);circleQueue.addQueue(10);circleQueue.addQueue(11);circleQueue.addQueue(12);System.out.println("加入数据后队列为:");circleQueue.show();circleQueue.deleteQueue();circleQueue.addQueue(0);System.out.println("删除数据后队列为: ");circleQueue.show();}public CircleQueue(int maxSize) {this.maxSize = maxSize;queue = new int[this.maxSize];pre = 0;rear = 0;}/*** 判断该队列是否已满** @return*/public boolean isFull() {return (rear + 1) % maxSize == pre;}/*** 判断该队列是否空** @return*/public boolean isEmpty() {return rear == pre;}/*** 加入数据到队列中** @param num 要传入的数据*/public void addQueue(int num) {if (isFull()) {System.out.println("该队列已满,无法添加");return;}queue[rear] = num;//加入完数据后rear指针要向后移动,借助取模以达到循环rear = (rear + 1) % maxSize;}/*** 删除队列中的数据* 遵循先进先出原则*/public int deleteQueue() {if (isEmpty()) {throw new RuntimeException("该队列为空,无法取出数据");}int result = queue[pre];//弹出数据后pre指针要向后移动,借助取模以达到循环pre = (pre + 1) % maxSize;return result;}/*** 获取头数据** @return*/public int getHead() {return queue[pre + 1];}/*** 获取有效数据的个数** @return*/public int size() {return (rear - pre + maxSize) % maxSize;}/*** 显示队列的所有数据*/public void show() {if (isEmpty()) {System.out.println("队列中没有数据");return;}for (int i = pre; i < pre + size(); i++) {i = i % maxSize;//为了防止i的数值大于数组的长度System.out.print(queue[i] + "  ");}System.out.println();}
}


http://chatgpt.dhexx.cn/article/R3lLCjY3.shtml

相关文章

环形队列(Python代码实现)

环形队列是是在普通队列上进行的变化&#xff0c;本质和普通单向队列相同&#xff0c;都是队尾进队&#xff0c;队首出队。环形队列与普通队列的区别在于它能够循环利用空间&#xff0c;元素从队首出队后释放的空间能够被重复利用。 主要特点&#xff1a; 当队尾指针front M…

队列和环形队列

1、队列 1) 队列是一个有序列表&#xff0c;可以用数组或是链表来实现。 2) 遵循先入先出的原则。即&#xff1a;先存入队列的数据&#xff0c;要先取出。后存入的要后取出。 实例&#xff1a; 声明&#xff1a; MaxSize&#xff1a;队列最大的长度 rear&#xff1a;尾指针&…

数据结构与基础算法-环形队列

一、什么是环形队列。 其实在内存上并没有所谓的环形队列&#xff0c;环形队列只是基于数组线性空间来实现。 环形队列优点&#xff1a; 避免假溢出现象。&#xff08;因为在数组里&#xff0c;头尾指针只增加不减少&#xff0c;被删元素的空间再也不能被重新利用。会造成尾…

无锁环形队列的几种高效实现

1.环形队列是什么 队列是一种常用的数据结构&#xff0c;这种结构保证了数据是按照“先进先出”的原则进行操作的&#xff0c;即最先进去的元素也是最先出来的元素.环形队列是一种特殊的队列结构&#xff0c;保证了元素也是先进先出的&#xff0c;但与一般队列的区别是&#…

队列——数组实现环形队列

【目的】 数组实现环形队列 【思路分析】 1. front 变量的含义做一个调整&#xff1a; front 就指向队列的第一个元素, 也就是说 arr[front] 就是队列的第一个元素 front 的初始值 0 2. rear 变量的含义做一个调整&#xff1a;rear 指向队列的最后一个元素的后一个位置. …

常用数据结构 ——— 队列(环形队列和顺序队列)

目录 一、队列简介 二、顺序队列 三、环形队列 四、环形队列代码 1、队列结构体 2、队列初始化 3、判断队列是否为满 4、判断队列是否为空 5、将数据插入到队列中 6、读取队列中的数据 7、释放队列空间 8、功能测试 一、队列简介 队列只允许在队列头&#xff08;fr…

[Data structure]队列环形队列 | 一文带你彻底搞懂队列和环形队列(内附详细图解和代码实现)

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;数据结构。数据结构专栏主要是在讲解原理的基础上拿Java实现 ⭐如果觉得文章写的不错&#xff0c;欢迎点个关注一…

C语言环形队列

#include <stdio.h> #define Len 6 unsigned char Input_Buff[6] {0}; //用户输入缓冲区 unsigned char Input_Num 0; //输入队列数据字节数 unsigned char Output_Num 0; //从队列取出的数据字节数 struct Queue {unsigned char Buffer[Len]; unsigned c…

【数据结构】队列、环形队列

目录 1.队列的概念及结构 2.队列的实现 3.队列的相关实现函数与源代码 3.1初始化队列 3.2 队尾入队列 3.3 队头出队列 3.4获取队列头部元素 3.5 获取队列队尾元素 3.6 获取队列中有效元素个数 3.7检测队列是否为空 3.8销毁队列 4.环形队列 4.1环形队列概念 …

java环形队列_数组实现环形队列Java

用数组实现环形队列的特点是高效。 能快速判断队列是否 满/空&#xff1b; 能快速存取数据。 因为简单高效&#xff0c;所以甚至在硬件中都实现了环形队列。 环形队列广泛应用于网络数据的收发&#xff0c;和不同应用间数据交换(内核和应用程序大量交换数据&#xff0c;从硬件接…

环形队列初步探讨

文章目录 前言一、环形队列二、环形队列基本操作二、示例总结 前言 最近使用队列的时候&#xff0c;在实现大数据整体平移的时候还是用了内存copy虽然暂时达到性能要求&#xff0c;但是总感觉很笨重&#xff0c;最后用环形队列重构了部分代码&#xff0c;效果还行。 一、环形队…

环形队列

介绍 环形队列是队列的一种特殊情况&#xff0c;也是基于队列的实现&#xff0c;队列是动态的集合&#xff0c;而环形队列则是固定长度的&#xff0c;当队列满时&#xff0c;则从队首删除元素。其原理基本和队列一致&#xff0c;都是实现先进先出的策略。 实现 先定义数据&…

C语言,环形队列

什么是环形队列&#xff1f; 环形缓冲区是一个非常典型的数据结构&#xff0c;这种数据结构符合生产者&#xff0c;消费者模型&#xff0c;可以理解它是一个水坑&#xff0c;生产者不断的往里面灌水&#xff0c;消费者就不断的从里面取出水。 那就可能会有人问&#xff0c;既然…

数据结构(10)---队列之环形队列

环形队列 文章目录 环形队列什么是环形队列循环队列的实现第一种实现第二种实现 什么是环形队列 环形队列也是队列的一种数据结构, 也是在队头出队, 队尾入队; 只是环形队列的大小是确定的, 不能进行一个长度的增加, 当你把一个环形队列创建好之后, 它能存放的元素个数是确定的…

数据结构--环形队列的介绍与实现

数据结构--环形队列实现 一、环形队列实现原理环形队列的几个判断条件 二、代码实现1.环形队列类&#xff08;CircleQueue&#xff09;2.环形队列类测试类3.程序运行结果4.完整代码 环形队列可以用数组实现&#xff0c;也可以使用循环链表实现.在使用数组实现循环队列的时候&am…

【数据结构(C语言描述)】环形队列

目录 一、基础知识二、数组实现环队2.1 初始化2.2 判断环队是否为空2.3 判断环队是否为满2.4 入队2.5 出队2.6 取队头元素2.7 取队尾元素2.8 销毁环队 三、链表实现环队3.1 初始化3.2 判断环队是否为空3.3 判断环队是否为满3.4 入队3.5 出队3.6 取队头元素3.7 取队尾元素3.8 销…

环形队列原理,全网最通俗易懂

队列是什么 队列是一种很常见的数据结构&#xff0c;满足先进先出的方式&#xff0c;如果我们设定队列的最大长度&#xff0c;那就意味着进队列和出队列的元素的数量实则满足一种动态平衡。 如果我们把首次添加入队列的元素作为一个一维坐标的原点&#xff0c;那么随着队列中…

Mysql 死锁和死锁的解决方案

最近在研究Mysql底层原理&#xff0c;研究到了死锁&#xff0c;感觉挺有意思&#xff0c;在这里和大家分享一下 前置知识&#xff1a;需要了解锁的种类&#xff0c;如表锁、行锁&#xff1b;行锁又分为记录锁、间隙锁、临键锁等等&#xff1b;什么情况下会加表锁&#xff0c;什…

mysql死锁演示

背景&#xff1a; 线上日志突然爆了有数据库死锁的日志。 通过以下语句查询数据库死锁的日志 SHOW ENGINE INNODB STATUS 通过 日志分析&#xff0c;看到了两条update语句并且是里面有子查询。还有两个表的更新顺序问题。 解决方案是&#xff1a;加了分布式锁&#xff0c;…

记录一次mysql死锁

一&#xff0c;死锁发现 项目中有一个接口包含更新操作1&#xff0c;后面发现更新失败&#xff0c;通过查看应用程序日志&#xff0c;发现发生了死锁 sql 1 如下 1.最初版本根据id为条件&#xff0c;更新&#xff08;plan_start_time 二级索引&#xff09; update tt_task …