队列和环形队列

573-环形队列和链式队列实现 环形队列实现 注意一下扩容操作: #include <iostream> using namespace std; //环形队列:queue push pop front back empty size class Queue { public: Queue(int size = 10)//构造函数 : cap_(size) , front_(0) , rear_(0) , size_(0) { 阅读详情

1.什么是队列

队列是我们平时生活中比较常见的一种数据结构,比如银行的叫号排队就是一个典型的队列,或者我们更常见的食堂排队打饭,等等等等

a.队列是一个有序列表,可以是数组或者链表来实现
b.队列遵循先进先出的原则,即现存入队列的数据要先取出,后存入队列的数据要后取出

队列示意图

2.数组模拟队列的思路

队列本身是有序列表,若使用数组结构来存储队列的数据,则队列数组的声明如下图,其中maxsize是该队列的最大容量,因为队列的输出,输入是分别从队列头和队列尾来处理,因此需要两个变量front和rear来记录队列头和队列尾的下标,front会随着数据的输出而改变,rear会根据数据的输入而改变

在这里插入图片描述
当我们将数据存入队列时需要注意两个步骤
(1):将尾指针rear向后移:rear=rear+1,且当front=rear时队列为空
(2):当尾指针rear小于队列最大容量maxsize-1,则说明队列未满,此时可以向队列插入数据,若rear=maxsize-1,则说明队列已满,此时将不能插入数据

3.数组模拟队列的代码实现

public class ArrayQueue {
     private int maxsize;//队列的最大长度
     private int front;//头部指针
     private int rear;//尾部指针
     private int arr[]; //队列数组
     
     //队列构造器
     public void queue(int size) {
    	 maxsize=size;
    	 front = -1;
    	 rear = -1;
    	 arr =new int [maxsize];
     }
     
     //判断队列是否为空
     public boolean isempty() {
    	  return front==rear;
     }
     
     //判断队列是否已满
     
     public boolean isfull() {
    	 return rear==maxsize-1;
     }
     
     //添加数据到队列
     
     public void addqueue(int n) {
    	 if(isfull()) {
    		 System.out.println("队列数据已满");
    	 }else {
    		 rear++;
    		 arr[rear]=n;
    	 }
     }
     
     //从队列取出数据
     
     public int getqueue() {
    	 if(isempty()) {
    		throw new RuntimeException("此队列无数据");
    	 }else {
    		 front++;
    		 return arr[front];
    		 
    	 }
     }
     
     //返回当前队列的有效数据个数
     
     public int size() {
    	 return rear-front;
     }
     
     //显示当前队列中的所有数据
     public void show() {
    	 for(int i=0;i<rear;i++) {
    		 System.out.print(arr[i]+" ");
    	 }
     }
     
}

4.数组实现队列的缺陷

虽然我们已经实现了用数组去实现一个队列,但是其中还是有缺陷,那就是数组使用了一次就无法再使用了,比如将队列插满数据后如果你取数据后再插你会发现并不能将数据插进去,原因很简单,因为在数据插满后rear和front的值就没有再改变过,所以插不进去,所以我们为了提高复用性用取模的方式改进让它变成一个环形队列

5.环形队列

与之前的不同
a.环形队列尾索引的下一个头索引时则表示队列已满,即将队列容量空出一个作为约定,这个在做判断满的时候需要注意(rear+1)%maxsize==front则表示队列已满
b.rear=front时表示队列为空

在这里插入图片描述

6.环形队列的代码实现

public class CircleQueue {
	  private int maxsize;//队列的最大长度
	     private int front;//头部指针
	     private int rear;//尾部指针
	     private int arr[]; //队列数组
	     
	     //队列构造器
	     public void queue(int size) {
	    	 maxsize=size+1;
	    	 arr =new int [maxsize];
	     }
	     
	     //判断队列是否为空
	     public boolean isempty() {
	    	  return front==rear;
	     }
	     
	     //判断队列是否已满
	     
	     public boolean isfull() {
	    	 return (rear+1)%maxsize==front;
	     }
	     
	     //添加数据到队列
	     
	     public void addqueue(int n) {
	    	 if(isfull()) {
	    		 System.out.println("队列数据已满");
	    	 }else {
	    		 arr[rear]=n;
	    		 rear=(rear+1)%maxsize;
	    		 System.out.println(rear);
	    	 }
	     }
	     
	     //从队列取出数据
	     
	     public int getqueue() {
	    	 if(isempty()) {
	    		throw new RuntimeException("此队列无数据");
	    	 }else {
	    		 int value=arr[front];
	    		 front=(front+1)%maxsize;
	    		 return value;
	    		 
	    	 }
	     }
	     
	     //返回当前队列的有效数据个数
	     
	     public int size() {
	    	 return (rear-front+maxsize)%maxsize;
	     }
	     
	     
	     public void show() {
	    	 for(int i=front;i<front+size();i++) {
	    		 System.out.print(arr[i]+" ");
	    	 }
	     }
	     
	    
}

此时我们来测试下

public class CircleQueueDemo {
  public static void main(String[] args) {
	CircleQueue c=new CircleQueue();
	c.queue(5);
	c.addqueue(20);
	c.addqueue(30);
	c.addqueue(40);
	c.addqueue(50);
	c.addqueue(60);
	c.show();
	c.getqueue();
	c.getqueue();
	c.getqueue();
	c.getqueue();
	System.out.println();
	c.addqueue(123);
	c.show();
}
}

在这里插入图片描述
这样一个数组就来重复使用了,一个环形队列也就出来了

对比线性队列缓冲和环形队列缓冲 定义:线性队列缓冲是一种基于线性表实现的队列结构,遵循先进先出(FIFO)的原则。特点队列的一端为队头(Front),用于出队操作。队列的另一端为队尾(Rear),用于入队操作。每次出队操作后,队头指针需要向后移动一位。空间利用率相对较低,因为一旦队尾移动到数组末尾,即使前面有空闲空间,也无法再被利用。特性线性队列缓冲环形队列缓冲实现复杂度简单稍复杂内存利用可能浪费内存高效利用内存数据移动需要移动数据不需要移动数据插入/删除效率可能需要O(n)通常O(1) 阅读详情

相关推荐

AD服务器搭建

一、角色安装1)打开服务器管理器,添加 角色和功能;2) 点 下一步;3)点 下一步;4)点 下一步;5)点击安装;6-1)将此服务器提升为域控制器;6-2)点下一步;6)输入密码 点 下一步;7)自动生成LIXF,点击下一步;8)确认目录,点下一步;8)确认安装条件,点安装; 8)安装成功,点关闭;...

潇峰的博客 6441

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

本文介绍数据结构中的简单队列和环形队列。

逐梦苍穹的博客 3855

致远OA系统表单相关操作记录(一)

致远OA系统表单相关操作

weixin_59666050的博客 6095

数据结构——队列

队列一种先进先出(FIFO)的数据结构,是一种只能在一端进行插入在另一端进行删除操作的特殊线性表。

ttdffmm的博客 652

Qt跨平台CAN通信实战:Vector、PCAN与周立功设备统一接口设计

本文针对Qt开发中常见的多品牌CAN设备兼容难题,提出了一套统一的跨平台CAN通信接口设计方案。通过抽象层封装,实现了对Vector、PCAN和周立功设备的统一操作,上层业务代码无需修改即可在不同硬件间切换,有效解决了驱动API差异、环境配置复杂和维护成本高等痛点,显著提升了代码复用率和开发效率。

weixin_29161785的博客 329

AI人工智能领域持续学习:提升技术能力的关键

在当今科技飞速发展的时代,AI人工智能已经渗透到我们生活的方方面面。本文章的目的就是帮助大家了解在AI人工智能领域持续学习的重要性,以及如何通过持续学习来提升自己的技术能力。文章会涵盖AI的核心概念、持续学习的原理和方法、实际应用场景等方面,让大家对AI领域的持续学习有一个全面的认识。本文首先会介绍AI人工智能的核心概念,让大家对这个领域有一个初步的了解。然后详细讲解持续学习的原理和方法,通过代码示例展示如何在实际项目中实现持续学习。接着会分析AI持续学习在不同场景的应用,推荐一些学习工具和资源。

AI 原生应用开发的博客 1288

【数据结构】队列---超详解

/定义类型//链表队列//队列特点:先进先出,队尾入数据,队头出数据}QNode;int size;}Queue;链表的结点由数据域和指针域爱两个部分构成,这就意味着我们需要对多类数据进行操作,因此定义一个结构体,正好可以满足这一需求。队列在队尾入数据,队头出数据,因此我们单独定义一个头和尾,外加一个记录队列大小的size来定义队列,以便后续实现队列的各种功能。用类型重定义关键字typedef。

2201_75806908的博客 929

跨 Agent 语义沟通机制构建:共享知识图谱与语义对齐方法

在具身智能与多智能体系统协同日益复杂化的背景下,跨 Agent 的语义沟通能力成为任务完成效率和系统鲁棒性提升的关键技术路径。本文系统分析了当前业界在共享知识图谱、语义嵌入对齐、语义意图建模与跨模态语义通信协议设计方面的实践经验,深入讲解如何在 Habitat-MARL 与 Isaac-MARL 等平台中,基于实体-关系结构、语义分布表示与任务上下文,构建具备理解、共享、协作能力的多 Agent 语义系统。文章以工程实战为主,覆盖图谱构建、语义嵌入同步、对齐模型部署、通信接口集成等多个核心模块,结合真实应用

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1292

队列练习之Example004-设计一个循环队列,用 front 和 rear 分别作为队头和队尾指针,另外用一个标志 tag 表示队列是空还是不空

设计一个循环队列,用 front 和 rear 分别作为队头和队尾指针,另外用一个标志 tag 表示队列是空还是不空,约定当 tag 为 0 时队空,当 tag 为 1 时队不空,这样就可以用 `front==rear` 作为队满的条件。要求,设计队列的结构和相关基本运算算法(队列元素为 int 型)。

二木成林 5468

【高级雷达感知与学习】 第十三章 可解释性与物理–感知融合(Physics-Informed ML)

本文提出了一种面向雷达感知的物理约束学习方法,将雷达物理先验(RCS、SNR、距离衰减)嵌入神经网络,解决纯数据驱动模型的样本效率低、泛化能力弱和决策不可信问题。通过三种融合范式(混合建模、物理正则化、PINNs)实现机理与数据协同建模,并设计了物理引导显著图解决雷达可解释性语义错位问题。实验表明,物理约束可提升40%样本效率,增强低信噪比场景鲁棒性。代码实现包含物理正则化损失、可解释性分析和消融实验,为雷达感知系统提供了可迁移的工程范本。

VectorShift的博客 185

ESP32 VSCode开发环境配置

ESP32 VSCode开发环境配置

qq_53529450的博客 507

【数据结构之队列系列】队列详解

前面我们学习了一种数据结构:栈,栈是一种只允许在一端尽进行插入删除的数据结构,而今天我们将学习另一种数据结构:队列,队列是一种支持在一端进行插入,在另一端进行删除的数据结构。

胡坚涛的博客 4266

基于STM32的智能宠物喂食系统设计与实现(代码+PCB )

STM32;DHT11;本系统的软件程序基于Keil MDK-ARM V5集成开发环境进行编写和编译。Keil MDK是ARM公司官方推荐的嵌入式开发工具,支持ARM Cortex-M系列微控制器的程序开发,内置ARM C/C++编译器、调试器和仿真器,具有代码编辑、语法高亮、工程管理和在线调试等功能,是STM32开发领域应用最为广泛的IDE之一。

3254968421的博客 72

队列——普通队列和环形队列

队列 定义:由一个长度固定的数组和两个指针所组成的数据结构,先进先出。 功能:add delete list 实现逻辑:由组成队列的数组自身是不变化的,指针是一个表示数组下标,而且不断变化的一个数。由于下标的变化,所以可以对于数组不同位置的数进行操作。 建立 class ArrayQueue{ int[] queue;//储存元素的数组 int front;//前指针 int rear;//后指针 int max;//表示环形数组的长度 public ArrayQueue(int max){

Beyondandzy的博客 1159

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

队列和环形队列用数组的实现

队列队列简介队列实现思路分析存数据时思路:自定义的addQueue方法取数据时思路:自定义的removeQueue方法环形队列改进思路环形队列代码的实现总结 队列简介 队列就是一个有序的列表,可以用数组和链表来实现 1 2 3 4 5 …… 遵循的原则是先入先出原则,先存入队列的数据,先被取出,后存入的数据,后被取出。 图a是描述用数组实现队列的存元素,maxsize表示队列最大的容量。存的过程中,永远是从队尾存储元素,front指向队首的前一个位置,并且初始值为-1,rear指向队尾,初始

m0_56184347的博客 391

温度PID控制PLC程序

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

数据结构之队列和环形队列

队列实现 1.队列是一种有序列表,遵循先进先出的原则。 1.数组模拟队列,分别有队头和队尾指针,从-1开始,进队时队尾指针自增,出队时队头指针自增,队头是指向第一个数据的前一个位置。示意图如下: package Array; public class queuearray { public static void main(String[] args) { //测试队列 ArrayQueue aq = new ArrayQueue(3); aq.addData(1

sdshdutx的博客 193

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

队列和环形队列的实现

队列 1、基本介绍 队列是一个有序列表,可以用数组或是链表来实现。 遵循 先入先出(FIFO) 的原则。即:先存入队列的数据,要先取出。后存入的要后取出。 2、数组模拟队列 队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队列的最大容量。 因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front及 rear分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear则是随着数据输入而改变,如图所示(在这里fron

xiaoshiguang3的博客 554

普通队列和环形队列

普通 思路分析: 1)将尾指针往后移: rear+1, 当front== rear [ 空] 2)若尾指针rear小于队列的最大下标maxSize-1,则将数据存入rear所指的数 组元素中,否则无法存入数据。rear == maxSize- 1[队列满] 代码实现: package com.main.dataStructures; public class ArrayQueueDemo{ public static void main(String[] args) { ArrayQ

qq_45896732的博客 253

freertos中,队列和环形缓冲区有什么关系,该如何使用它们,使用队列必须使用环形缓冲区吗

**队列基于环形缓冲区实现**:FreeRTOS的队列底层使用了环形缓冲区的思想,但队列是一个更高层次的抽象,提供了线程安全和阻塞操作。// 缓冲区满,覆盖旧数据。- **队列已经封装了环形缓冲区的功能**:FreeRTOS队列内部使用了类似环形缓冲区的机制来存储数据,但用户无需手动实现。在FreeRTOS中,**队列**和**环形缓冲区**是两种不同的数据存储和传递机制,它们有各自的用途和特点。- **队列是线程安全的**:FreeRTOS队列内置了同步机制,适合任务之间的数据传递。

xiaojin511025的博客 948

用数组实现队列和环形队列

若尾指针 rear 小于队列的最大下标 maxSize-1,则将数据存入rear所指的数组元素中,否则无法存入数据。front变量的含义做一个调整:front就指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素. front的初始值=0。rear变量的含义做一个调整:rear指向队列的最后一个元素的后一个位置,因为希望空出一个空间 做为约定. rear的初始值=0。队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图,其中 maxSize 是该队列的最大容量。

MMMMMyyyyffff的博客 404

数组实现普通队列和环形队列

队列和环形队列 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录队列和环形队列前言一、队列是什么?二、实现思路和代码实现实现思路遗留问题三、环形队列环形队列实现思路总结 前言 本文主要介绍队列这种数据结构,并介绍使用数组如何实现,供大家参考 一、队列是什么?   这里引用百度百科介绍 : 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的

great_0630的博客 483

Java数据结构之队列和环形队列

队列概述 队列是 一个有序列表、遵循先入先出的原则、即先入队的数据要先取出,后入队的数据要后取出。 数组模拟单项队列 基本图示 代码示例 package com.hf.structures.queue; /** * @Copyright (C), 2017-2019, Exela-hov * @FileName: ArrayQueue * @Author: hf * ...

战丶后风!!的博客 1029

圆环和环形是一样的吗_数组模拟队列 以及队列的复用(环形队列)

使用数组模拟队列初始化队列private int front; 指向队列头的第一个元素privat int maxSzie; 设置队列的最大长度private int rear; 指向队列尾的最后一个元素的后一个位置,留出一个位置作为约定因为需要留出一个位置作为约定,那么当数组的 maxSize == 4; 的时候有效数据的个数就等于3个private int[] arr; 使用数组来存储数据,模...

weixin_39983404的博客 127
上一篇: 线程的生命周期(图解)
下一篇: java单链表的增删改查
interesting_code
博客等级 码龄7年 38粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值