Java 队列
基本介绍

数组模拟队列
思路分析

代码实现
import java.util.Scanner;public class Test {public static void main(String[] args) {// 创建一个队列ArrayQueue queue = new ArrayQueue(3);int select;Scanner scanner = new Scanner(System.in);boolean loop = true;while (loop) {System.out.println("\n----------队列操作菜单-----------");System.out.println("1、查看队列");System.out.println("2、添加数据到队列");System.out.println("3、取出队列元素");System.out.println("4、退出菜单");System.out.println("请选择:");select = scanner.nextInt();switch (select) {case 1: {queue.showQueue();break;}case 2: {System.out.println("请输入要添加的数据(数字类型):");int data = scanner.nextInt();queue.pushQueue(data);break;}case 3: {try {int data = queue.popQueue();System.out.println("队头元素为:" + data);} catch (Exception e) {System.out.println(e.getMessage());}break;}case 4: {loop = false;break;}}}scanner.close();}
}// 用数组模拟队列
class ArrayQueue {private int maxSize; // 队列的最大容量private int front; // 队头指针private int rear; // 队尾指针private int[] queue; // 队列,用于存储数据,此处用数组模拟ArrayQueue(int maxSize) {// 初始化数据this.maxSize = maxSize;// 根据 maxSize 创建一个队列this.queue = new int[maxSize];// 初始让队头队尾为 -1this.front = -1; // front 指向队头的前一个位置,若为 0 则指向队头那一个位置this.rear = -1; // rear 指向队尾的位置}// 队列判空public boolean isEmpty() {return front == rear;}// 队列判满public boolean isFull() {return rear == maxSize - 1;}// 入队public void pushQueue(int data) {// 先判断队列是否满了if (isFull()) {System.out.println("队列已满,不能添加数据了");return;}rear++; // 移动队尾指针,指向后一个空的位置queue[rear] = data; // 向该空的位置添加数据,此时 rear 依旧指向队尾最后一个数据}// 出队public int popQueue() {// 先判断队列是否为空if (isEmpty()) {throw new RuntimeException("队列为空,不能获取数据");}// 此时 front 指向后一个位置,该位置是要被取出数据的位置// 数据取出后相当于队列移除该数据了,所以 front 仍然指向队头位置的前一个位置front++;return queue[front];}// 打印队列public void showQueue() {if (isEmpty()) {System.out.println("队列为空...");return;}System.out.println("队列元素为:");for (int i = front + 1; i <= rear; i++) {System.out.printf(queue[i] + "\t");}System.out.println();}
}
数组模拟环形队列
在上一个实现中,数组使用一次就不能再使用,没有达到复用效果,造成空间的浪费。
思路分析

代码实现
import java.util.Scanner;public class Test {public static void main(String[] args) {// 创建一个队列// 因为有一个位置是用于判断队列是否为满,即不存储具体数据,所以实际队列容量为 4-1=3CircleArrayQueue queue = new CircleArrayQueue(4);int select;Scanner scanner = new Scanner(System.in);boolean loop = true;while (loop) {System.out.println("\n----------队列操作菜单-----------");System.out.println("1、查看队列");System.out.println("2、添加数据到队列");System.out.println("3、取出队列元素");System.out.println("4、退出菜单");System.out.println("请选择:");select = scanner.nextInt();switch (select) {case 1: {queue.showQueue();break;}case 2: {System.out.println("请输入要添加的数据(数字类型):");int data = scanner.nextInt();queue.pushQueue(data);break;}case 3: {try {int data = queue.popQueue();System.out.println("队头元素为:" + data);} catch (Exception e) {System.out.println(e.getMessage());}break;}case 4: {loop = false;break;}}}scanner.close();}
}// 用数组模拟环形队列
class CircleArrayQueue {private int maxSize; // 队列的最大容量// front 指向队列的第一个元素,也就是说 queue[front] 就是队列的第一个元素// front 的初始值为 0private int front; // 队头指针// rear 指向队列的最后一个元素的后一个位置,因为希望空出一个位置作为判断队列是否为满的标志// rear 的初始值为 0private int rear; // 队尾指针private int[] queue; // 队列,用于存储数据,此处用数组模拟CircleArrayQueue(int maxSize) {// 初始化数据this.maxSize = maxSize;// 根据 maxSize 创建一个队列this.queue = new int[maxSize];// 初始让队头队尾为 0,也可以不写,因为成员变量默认值就是为 0this.front = 0;this.rear = 0;}// 队列判空public boolean isEmpty() {return front == rear;}// 队列判满public boolean isFull() {return (rear + 1) % maxSize == front;}// 入队public void pushQueue(int data) {// 先判断队列是否满了if (isFull()) {System.out.println("队列已满,不能添加数据了");return;}// 因为 rear 本身就指向队列最后一个元素的后一个位置,所以可以直接将数据加入queue[rear] = data;// 将 rear 后移,需要取模,因为可能数组前面是可利用的空间,把 rear 指向前面空的位置rear = (rear + 1) % maxSize;}// 出队public int popQueue() {// 先判断队列是否为空if (isEmpty()) {throw new RuntimeException("队列为空,不能获取数据");}// front 指向队列的第一个元素// 先把 front 对应的值用一个临时变量存储// 将 front 后移,需要取模// 将临时变量返回int val = queue[front];front = (front + 1) % maxSize;return val;}// 打印队列public void showQueue() {if (isEmpty()) {System.out.println("队列为空...");return;}System.out.println("队列元素为:");int size = queueSize();for (int i = front; i < front + size; i++) {System.out.printf(queue[i % maxSize] + "\t");}System.out.println();}// 求出当前队列有效数据的个数public int queueSize() {return (rear + maxSize - front) % maxSize;}
}
相关文章:
Java 队列
基本介绍 数组模拟队列 思路分析 代码实现 import java.util.Scanner;public class Test {public static void main(String[] args) {// 创建一个队列ArrayQueue queue new ArrayQueue(3);int select;Scanner scanner new Scanner(System.in);boolean loop true;while (lo…...
【算法基础:搜索与图论】3.6 二分图(染色法判定二分图匈牙利算法)
文章目录 二分图介绍染色法判定二分图例题:860. 染色法判定二分图 匈牙利匹配二分图最大匹配匈牙利匹配算法思想例题:861. 二分图的最大匹配 二分图介绍 https://oi-wiki.org/graph/bi-graph/ 二分图是图论中的一个概念,它的所有节点可以被…...
SpringMVC 怎么和 AJAX 相互调用的
通过 Jackson 框架就可以把 Java 里面的对象直接转化成 Js 可以识别的 Json 对象。 步骤如下 : a、加入 Jackson.jar b、在配置文件中配置 json 的映射 c、在接受 Ajax 方法里面可以直接返回 Object,List 等,但方法前面要加上ResponseBody 详细步骤: …...
UCDOS和WPS推动计算机领域的汉字化发展,中文编程该谁力扛大旗?
你还记得UCDOS吗? 从DOS时代过来的人,还知道UCDOS的,现在可能已经是中年人了! 当时,鲍岳桥的UCDOS可以称得上是中国的国产操作系统。 在Windows还没来得及进入中国市场时,UCDOS可以说是走向了巅峰时刻&a…...
golang+layui提升界面美化度--[推荐]
一、背景 golanglayui提升界面美化度--[推荐]; golang后端写的页面很难看,如何好看点呢,那就是layui https://layui.dev/ 也是一个简单上手容易使用的框架,类似jquery,对于后端开发来说满足使用需求 二、使用注意点…...
42. 接雨水
题目介绍 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3…...
Python学习阶段路线和内容
Python学习阶段路线和内容 这是我的看法和认识,供参考。 Python学习路线主要分为三个阶段:入门阶段、提高阶段和深入阶段。 入门阶段 入门阶段需要学习Python的基本语法,掌握变量和数据类型、条件语句和循环语句、函数和模块等内容。并通过…...
RocketMQ教程-安装和配置
Linux系统安装配置 64位操作系统,推荐 Linux/Unix/macOS 64位 JDK 1.8 Maven3.0 yum 安装jdk8 yum 安装maven 1.下载安装Apache RocketMQ RocketMQ 的安装包分为两种,二进制包和源码包。 点击这里 下载 Apache RocketMQ 5.1.3的源码包。你也可以从这…...
【LeetCode】55.跳跃游戏
题目 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示例 1: 输入:nums [2,3,1,1,4] 输出:true 解释:可以…...
Docker学习路线12:开发者体验
到目前为止,我们只讨论了使用Docker来部署应用程序。然而,Docker也是一个极好的用于开发应用程序的工具。可以采用一些不同的建议来改善开发体验。 在应用程序中使用docker-compose以方便开发。使用绑定挂载将本地代码挂载到容器文件系统中,…...
后端服务迁移方案及过程记录
阶段时序动作双写数据对比1新rdb集群上线双写数据对比2新服务上线,无流量双写数据对比2后端自己发起的流程比如job,新服务上线一份新的,独立运行双写数据对比2消费二方mq,新服务使用新的消费组消费原有消息双写数据对比3新旧服务比…...
StAX解析
StAX解析 StAX解析介绍 StAX解析与SAX解析类似,也是基于事件驱动的,不同之处在于StAX采用的是拉模式,应用程序通过调用解析器推进解析的进程,可以调用next()方法来获取下一个解析事件(开始文档,结束文档,开…...
[MCU]AUTOSAR COM STACK - CAN协议栈
各层PDU PDU:Protocal Data Unit,协议数据单元,由SDU和PCI组成; I-PDU:Interaction Layer PDU,数据交互层PDU;N-PDU:NetWork Layer PDU,网络层PDU,通常用的…...
React:从 npx开始
使用 npm 来创建第一个 recat 文件( react-demo 是文件名,可以自定义) npx create-react-app react-demo npx是 npm v5.2 版本新添加的命令,用来简化 npm 中工具包的使用 原始: 全局安装npm i -g create-react-app 2 …...
力扣热门100题之接雨水【困难】
题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3…...
Stable-Diffusion-Webui部署SDXL0.9报错参数shape不匹配解决
问题 已经在model/stable-diffusion文件夹下放进去了sdxl0.9的safetensor文件,但是在切换model的时候,会报错model的shape不一致。 解决方法 git pullupdate一些web-ui项目就可以,因为当前项目太老了,没有使用最新的版本。...
Springboot @Async 多线程获取返回值
Springboot Async 多线程获取返回值 需求背景 最近需要用到多线程, 自己维护线程池很麻烦, 正好看到Springboot集成线程池的例子, 这里自己做了个尝试和总结, 记录一下, 也分享给需要的朋友; 不考虑事务的情况下, 这个多线程实现比较简单, 主要有以下几点: 在启动类加上Enab…...
怎样接入chatGPT
官网链接: OpenAI platform...
Docker consul容器服务更新与发现
Docker consul容器服务更新与发现 一、什么事服务注册与发现二、什么是consul三、consul部署1、consul服务器2、registrator服务器3、consul-template 一、什么事服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可…...
[算法很美打卡] 多维数组篇 (打卡第一天)
文章目录 顺时针打印二维数组0所在的行列清零 顺时针打印二维数组 package 每日算法学习打卡.算法打卡.七月份.七月二十六号;public class test1 {public static void main(String[] args) {int[][] matrix {{1,2},{5,6},{9,10},{13,14},};print(matrix);}static void print(i…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
