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

数组模拟环形队列详解

数组模拟环形队列

实现逻辑

  1. 创建一个固定大小的数组作为队列的存储空间,同时定义队列的头部和尾部指针(front和rear)。
  2. 初始时,将头部和尾部指针都设置为0,表示队列为空。
  3. 入队操作(enqueue):
    • 首先,判断队列是否已满。如果队列已满,无法再添加新的元素,直接返回。
      • 队列满的判断:
        • 公式:(rear + 1) % N == front
        • 说明:当队列满时,尾部指针的下一个位置就是头部指针的位置。
        • 解释:由于环形队列的特性,当尾部指针到达数组的末尾时,需要将尾部指针重新设置为数组的起始位置,即尾部指针加1后取模。当取模运算的结果与头部指针相等时,表示队列已满。
    • 如果队列未满,将新元素添加到尾部指针所指向的位置,并将尾部指针后移一位。
    • 注意:如果尾部指针已经到达数组的末尾,需要将尾部指针重新设置为数组的起始位置,实现循环利用。
  4. 出队操作(dequeue):
    • 首先,判断队列是否为空。如果队列为空,无法进行出队操作,直接返回。
      • 队列空的判断:
        • 公式:front == rear
        • 说明:当队列为空时,头部指针和尾部指针指向同一个位置,即队列中没有有效元素。
        • 解释:由于队列的初始状态是空的,所以头部指针和尾部指针都初始化为0。当进行出队操作时,头部指针会递增,当头部指针和尾部指针相等时,表示队列为空。
    • 如果队列不为空,将头部指针所指向的元素取出,并将头部指针后移一位。
    • 注意:如果头部指针已经到达数组的末尾,需要将头部指针重新设置为数组的起始位置,实现循环利用。
  5. 队列长度(size):
    • 队列的长度可以通过尾部指针减去头部指针来计算,但这个结果可能为负数或超过数组的大小。
    • 为了得到正确的队列长度,需要进行取模运算。具体做法是先计算尾部指针减去头部指针的差值,然后对数组的大小取模。
      • 队列中的有效元素个数:
        • 公式:(rear - front + N) % N
        • 说明:计算尾部指针和头部指针之间的差值,并对数组大小取模,得到队列中的有效元素个数。
        • 解释:当进行入队操作时,尾部指针会递增;当进行出队操作时,头部指针会递增。通过计算尾部指针减去头部指针的差值,可以得到队列中的有效元素个数。由于差值可能为负数或超过数组的大小,所以需要对数组大小取模,确保结果在合法范围内。

为什么需要用到取模运算实现?

取模运算的作用是将超出数组大小的索引重新映射到数组的合法索引范围内,实现队列的循环利用。

在环形队列中,当尾部指针后移时,需要考虑数组的边界情况。如果不进行取模运算,当尾部指针达到数组的末尾时,无法再继续后移,导致队列无法正常工作。

通过取模运算,可以将尾部指针重新定位到数组的起始位置,使得队列能够形成环形结构。具体来说,取模运算可以将尾部指针的值限制在合法范围内,即在
0 到 (maxSize-1) 的范围内循环。

例如,假设数组的大小为5,且当前尾部指针的位置为4(即指向数组的最后一个元素)。如果不进行取模运算,将直接将尾部指针加1,即 4 + 1 = 5,超出了数组的索引范围。但是,如果进行取模运算,即 (4 + 1) % 5 = 0,尾部指针会重新定位到数组的起始位置,形成环形结构。

因此,通过取模运算,可以确保尾部指针始终在合法的索引范围内,使得环形队列的入队操作能够正常进行。

同样的道理,对于头部指针的后移操作也需要进行取模运算,以保证在环形队列中正确移动。

代码实现

1:定义环形队列

public class CircularQueue {private int[] queue;  // 存储队列元素的数组private int front;    // 头部指针private int rear;     // 尾部指针private int maxSize;  // 队列的最大容量public CircularQueue(int capacity) {maxSize = capacity + 1;  // 预留一个位置用于判断队列满queue = new int[maxSize];front = 0;rear = 0;}// 入队操作public void enqueue(int element) {if (isFull()) {System.out.println("队列已满,无法入队!");return;}queue[rear] = element;rear = (rear + 1) % maxSize;  // 尾部指针后移并取模}// 出队操作public int dequeue() {if (isEmpty()) {System.out.println("队列为空,无法出队!");return -1;}int element = queue[front];front = (front + 1) % maxSize;  // 头部指针后移并取模return element;}// 判断队列是否为空public boolean isEmpty() {return front == rear;}// 判断队列是否已满public boolean isFull() {return (rear + 1) % maxSize == front;}// 获取队列中的有效元素个数public int size() {return (rear - front + maxSize) % maxSize;}
}

2:使用环形队列

public class Main {public static void main(String[] args) {CircularQueue queue = new CircularQueue(5);  // 创建容量为5的环形队列queue.enqueue(1);  // 入队操作queue.enqueue(2);queue.enqueue(3);queue.enqueue(4);queue.enqueue(5);System.out.println("队列是否为空:" + queue.isEmpty());  // 判断队列是否为空System.out.println("队列是否已满:" + queue.isFull());  // 判断队列是否已满System.out.println("队列中的有效元素个数:" + queue.size());  // 获取队列中的有效元素个数while (!queue.isEmpty()) {int element = queue.dequeue();  // 出队操作System.out.println("出队元素:" + element);}}
}

相关文章:

数组模拟环形队列详解

数组模拟环形队列 实现逻辑 创建一个固定大小的数组作为队列的存储空间,同时定义队列的头部和尾部指针(front和rear)。初始时,将头部和尾部指针都设置为0,表示队列为空。入队操作(enqueue)&am…...

《论文阅读12》RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds

一、论文 研究领域:全监督3D语义分割(室内,室外RGB,kitti)论文:RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds CVPR 2020 牛津大学、中山大学、国防科技大学 论文链接论文gi…...

elementPlus使用el-icon

安装 # NPM $ npm install element-plus/icons-vue # Yarn $ yarn add element-plus/icons-vue # pnpm $ pnpm install element-plus/icons-vue一、main.ts(全局注册) import * as ElementIcons from element-plus/icons-vuefor (const key in Element…...

预测知识 | 神经网络、机器学习、深度学习

预测知识 | 预测技术流程及模型评价 目录 预测知识 | 预测技术流程及模型评价神经网络机器学习深度学习参考资料 神经网络 神经网络(neural network)是机器学习的一个重要分支,也是深度学习的核心算法。神经网络的名字和结构,源自…...

【Linux】进程的基本属性|父子进程关系

个人主页:🍝在肯德基吃麻辣烫 我的gitee:Linux仓库 个人专栏:Linux专栏 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处 文章目录 前言进程属性1.进程PID和PPID2.fork函数创建子进程1)为什…...

CCF考试:201809-1 卖菜(java代码)

目录 1、【问题描述】 2、【思路分析】 3、【代码区】 1、【问题描述】 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜。   第一天,每个商店都自己定了一个价格。店主们希望自己的菜价和其他商店的一致&#xf…...

android wifi扫描 framework层修改扫描间隔

frameworks/opt/net/wifi/service/java/com/android/server/wifi/ScanRequestProxy.java 这个也就是说前台应用可以在120s(2分钟) 扫描 4 次 * a) Each foreground app can request a max of* {link #SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS} scan every* {l…...

webstorm debug调试vue项目

1.运行npm,然后控制台会打印下图中的地址,复制local的地址 2.run–>Edit Configuration,如下图 3.设置测试项 4.在你需要的js段打好断点 5.在上边框的工具栏里面有debug运行,点击debug运行的图标运行即可...

嵌入式linux的八股文之旅 DAY1

1 三次握手 四次挥手 服务端 先从close到listen 然后第一个syn报文 客户端 生成初始序列号 client_isn (就是iternal sequence number 初始序列号) 然后放到TCP首部的序列号端里 然后把SYN标志位置一 然后发送给服务器端 之后处于SYN-SENT状态 服务器…...

同创永益郑阳|与数智化共舞·业务稳定性保障新动力

2023年8月2日,由北大创新评论主办的2023 Inno China中国产业创新大会-保险产业创新论坛在京举办。本次论坛由同创永益、青牛软件、DaoCloud道客联合主办,INNO创新家、产业集群发展提供战略支持,未名数创承办,邀请到了学术专家、行…...

史上最全的Qt控件

本软件是收费工具,学生党勿扰,闹眼子党勿扰,白嫖党勿扰 收费金额:1000元 1 概述 经过这两年的编写,写不少控件,甚至把刘某某90%的控件都绘制了一遍。当然后还有一些其他刘某没有控件。 2 功能 借用刘某博…...

星星之火:国产讯飞星火大模型的实际使用体验(与GPT对比)

#AIGC技术内容创作征文|全网寻找AI创作者,快来释放你的创作潜能吧!# 文章目录 1 前言2 测试详情2.1 文案写作2.2 知识写作2.3 阅读理解2.4 语意测试(重点关注)2.5 常识性测试(重点关注)2.6 代码…...

传输控制协议TCP

目录 TCP报文格式 TCP的特点 TCP原理: 1.确认应答机制 2.超时重传机制 3.连接管理机制 建立连接 ​编辑关闭连接 4.滑动窗口机制 ​5.流量控制 6.拥塞控制 7.延迟应答 8.捎带应答 TCP报文格式 1.源端口号:发送端的哪一个端口发出的 2.目的端口号:接收端的哪一个端…...

jmeter中用户参数和用户定义的变量的区别

如果使用jmeter做过参数化的人都知道,参数化的方式有多种,其中一种就是使用用户定义的变量,还有一种是使用用户参数。那么,这两个有什么异同呢? 一、先说相同的点: 1、都可以参数化,以供sample…...

WSL2 Ubuntu子系统安装OpenCV

文章目录 前言一、基本概念二、操作步骤1.下载源码2.安装依赖3.运行编译4.配置路径 前言 OpenCV用C语言编写,它的主要接口也是C语言,但是依然保留了大量的C语言接口。该库也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。这些语…...

KafkaStream:Springboot中集成

1、在kafka-demo中创建配置类 配置kafka参数 package com.heima.kafkademo.config;import lombok.Data; import org.apache.kafka.common.serialization.Serdes; import org.apache.kafka.streams.StreamsConfig; import org.springframework.boot.context.properties.Configu…...

包管理工具 nvm npm nrm yarn cnpm npx pnpm详解

包管理工具 nvm npm yarn cnpm npx pnpm npm、cnpm、yarn、pnpm、npx、nvm的区别:https://blog.csdn.net/weixin_53791978/article/details/122533843 npm、cnpm、yarn、pnpm、npx、nvm的区别:https://blog.csdn.net/weixin_53791978/article/details/1…...

【java】mybatis-plus代码生成

正常的代码生成这里就不介绍了。旨在记录实现如下功能: 分布式微服务环境下,生成的entity、dto、vo、feignClient等等api模块,需要和mapper、service、controller等等分在不同的目录生成。 为什么会出现这个需求? mybatis-plus&am…...

小样本UIE 信息抽取微调快速上手(不含doccona标注)

文章目录 1.安装环境(可略过)2.模型简介(略读)抽取任务输入输出示例:1.实体识别2.关系抽取 3.快速上手(主菜)(1)转换数据标注数据样例 (2)生成训练数据训练数据样例 &…...

Vue项目(购物车)

目录 购物车效果展示: 购物车代码: 购物车效果展示: 此项目添加、修改、删除数据的地方都写了浏览器都会把它存储起来 下次运行项目时会把浏览器数据拿出来并在页面展示 Video_20230816145047 购物车代码: 复制完代码&#xff0…...

YOLOv11城市道路摩托车与自行车目标检测数据集-1569张-motorcycle-1_2

YOLOv11城市道路摩托车与自行车目标检测数据集 📊 数据集基本信息 目标类别: [‘bike’, ‘motorcycle’]中文类别:[‘自行车’, ‘摩托车’]训练集:1374 张验证集:130 张测试集:65 张总计:1569…...

基于CMS8S6990评估板实现高精度电压电流测量:从血氧仪到通用测量工具的移植实践

1. 项目缘起与核心思路最近终于拿到了中微半导体(CMSemicon)正版的CMS8S6990血氧仪开发板。这块板子给我的第一印象就是“精致”,尺寸不大,但该有的接口和功能一应俱全,颇有点“麻雀虽小,五脏俱全”的味道。…...

国内开通 GPT 会员的自助充值流程记录

国内用户开通 GPT Plus / Pro,比较常见的卡点是支付方式、流程步骤和账号安全。我看了下 cdk.hohy6.com 这个页面,它的流程比较直接:选择套餐,填写 Session Token,支付宝付款,然后系统为自己的 ChatGPT 账号…...

TruckSim 仿真工作流实战:从参数修改到结果对比

1. TruckSim仿真工作流基础入门 第一次打开TruckSim时,很多新手会被复杂的界面吓到。其实只要掌握几个核心概念,就能快速上手这个强大的车辆动力学仿真工具。我刚开始使用时也走过不少弯路,现在把这些经验分享给大家。 TruckSim的工作流可以简…...

电脑突然‘哑巴’了?保姆级排查指南:从服务、驱动到系统修复,一步步搞定Win10音频问题

电脑突然‘哑巴’了?保姆级排查指南:从服务、驱动到系统修复,一步步搞定Win10音频问题 右下角的小喇叭突然打上红叉,视频会议开到一半突然失声,游戏打到关键处却没了音效——这些场景恐怕每个Windows 10用户都遭遇过。…...

独立开发者如何借助Taotoken的Token Plan降低AI应用长期运行成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何借助Taotoken的Token Plan降低AI应用长期运行成本 对于独立开发者和小型团队而言,构建AI应用时&#xf…...

OpenHarmony系统定制:实现开机自启动应用与Launcher替换实战

1. 项目概述:为OpenHarmony设备定义“开机即用”的体验最近在基于触觉智能的RK3566开发板上折腾OpenHarmony 4.1,一个很实际的需求浮出水面:如何让系统开机后,默认就打开我指定的应用?这不仅仅是开发者的自娱自乐&…...

A型流感病毒广谱中和抗体与广谱通用疫苗研究进展

摘要流感作为全球性的公共卫生问题,对人类健康构成严重威胁。接种流感疫苗是预防和控制流感流行的关键手段,但当前通用流感疫苗的研究尚处于初级阶段。本文聚焦于A型流感病毒,综述了广谱中和抗体的研究进展以及其在广谱通用疫苗研发中的潜在应…...

手把手教你用网络分析仪调试CGH40010F:从S参数异常反推管子损坏原因与状态

深度解析CGH40010F氮化镓功率管故障诊断:从S参数异常到失效机理 在射频功率放大器设计中,CGH40010F作为一款经典的氮化镓(GaN)功率晶体管,因其高功率密度和高效率特性被广泛应用于基站、雷达等场景。然而在实际工程调试中,工程师们…...

基于STM32H750XBH6开发板的LwIP socket编程初探

这里写目录标题 1、RAW、NETCONN和socket编程特点 2、基于socket的UDP编程 3、基于socket的TCP编程 3.1、TCP客户端编程 3.2、TCP客户端编程 4、问题记录 1、RAW、NETCONN和socket编程特点 LwIP下三种编程方式分别是RAW API、NETCONN API和Socket API,这三种方式均可以实现常用…...