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

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 二分图(染色法判定二分图匈牙利算法)

文章目录 二分图介绍染色法判定二分图例题&#xff1a;860. 染色法判定二分图 匈牙利匹配二分图最大匹配匈牙利匹配算法思想例题&#xff1a;861. 二分图的最大匹配 二分图介绍 https://oi-wiki.org/graph/bi-graph/ 二分图是图论中的一个概念&#xff0c;它的所有节点可以被…...

SpringMVC 怎么和 AJAX 相互调用的

通过 Jackson 框架就可以把 Java 里面的对象直接转化成 Js 可以识别的 Json 对象。 步骤如下 &#xff1a; a、加入 Jackson.jar b、在配置文件中配置 json 的映射 c、在接受 Ajax 方法里面可以直接返回 Object,List 等,但方法前面要加上ResponseBody 详细步骤&#xff1a; …...

UCDOS和WPS推动计算机领域的汉字化发展,中文编程该谁力扛大旗?

你还记得UCDOS吗&#xff1f; 从DOS时代过来的人&#xff0c;还知道UCDOS的&#xff0c;现在可能已经是中年人了&#xff01; 当时&#xff0c;鲍岳桥的UCDOS可以称得上是中国的国产操作系统。 在Windows还没来得及进入中国市场时&#xff0c;UCDOS可以说是走向了巅峰时刻&a…...

golang+layui提升界面美化度--[推荐]

一、背景 golanglayui提升界面美化度--[推荐]&#xff1b; golang后端写的页面很难看&#xff0c;如何好看点呢&#xff0c;那就是layui https://layui.dev/ 也是一个简单上手容易使用的框架&#xff0c;类似jquery&#xff0c;对于后端开发来说满足使用需求 二、使用注意点…...

42. 接雨水

题目介绍 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3…...

Python学习阶段路线和内容

Python学习阶段路线和内容 这是我的看法和认识&#xff0c;供参考。 Python学习路线主要分为三个阶段&#xff1a;入门阶段、提高阶段和深入阶段。 入门阶段 入门阶段需要学习Python的基本语法&#xff0c;掌握变量和数据类型、条件语句和循环语句、函数和模块等内容。并通过…...

RocketMQ教程-安装和配置

Linux系统安装配置 64位操作系统&#xff0c;推荐 Linux/Unix/macOS 64位 JDK 1.8 Maven3.0 yum 安装jdk8 yum 安装maven 1.下载安装Apache RocketMQ RocketMQ 的安装包分为两种&#xff0c;二进制包和源码包。 点击这里 下载 Apache RocketMQ 5.1.3的源码包。你也可以从这…...

【LeetCode】55.跳跃游戏

题目 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示例 1&#xff1a; 输入&#xff1a;nums [2,3,1,1,4] 输出&#xff1a;true 解释&#xff1a;可以…...

Docker学习路线12:开发者体验

到目前为止&#xff0c;我们只讨论了使用Docker来部署应用程序。然而&#xff0c;Docker也是一个极好的用于开发应用程序的工具。可以采用一些不同的建议来改善开发体验。 在应用程序中使用docker-compose以方便开发。使用绑定挂载将本地代码挂载到容器文件系统中&#xff0c;…...

后端服务迁移方案及过程记录

阶段时序动作双写数据对比1新rdb集群上线双写数据对比2新服务上线&#xff0c;无流量双写数据对比2后端自己发起的流程比如job&#xff0c;新服务上线一份新的&#xff0c;独立运行双写数据对比2消费二方mq&#xff0c;新服务使用新的消费组消费原有消息双写数据对比3新旧服务比…...

StAX解析

StAX解析 StAX解析介绍 StAX解析与SAX解析类似&#xff0c;也是基于事件驱动的&#xff0c;不同之处在于StAX采用的是拉模式&#xff0c;应用程序通过调用解析器推进解析的进程&#xff0c;可以调用next()方法来获取下一个解析事件(开始文档&#xff0c;结束文档&#xff0c;开…...

[MCU]AUTOSAR COM STACK - CAN协议栈

各层PDU PDU&#xff1a;Protocal Data Unit&#xff0c;协议数据单元&#xff0c;由SDU和PCI组成&#xff1b; I-PDU&#xff1a;Interaction Layer PDU&#xff0c;数据交互层PDU&#xff1b;N-PDU&#xff1a;NetWork Layer PDU&#xff0c;网络层PDU&#xff0c;通常用的…...

React:从 npx开始

使用 npm 来创建第一个 recat 文件&#xff08; react-demo 是文件名&#xff0c;可以自定义&#xff09; npx create-react-app react-demo npx是 npm v5.2 版本新添加的命令&#xff0c;用来简化 npm 中工具包的使用 原始&#xff1a; 全局安装npm i -g create-react-app 2 …...

力扣热门100题之接雨水【困难】

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3…...

Stable-Diffusion-Webui部署SDXL0.9报错参数shape不匹配解决

问题 已经在model/stable-diffusion文件夹下放进去了sdxl0.9的safetensor文件&#xff0c;但是在切换model的时候&#xff0c;会报错model的shape不一致。 解决方法 git pullupdate一些web-ui项目就可以&#xff0c;因为当前项目太老了&#xff0c;没有使用最新的版本。...

Springboot @Async 多线程获取返回值

Springboot Async 多线程获取返回值 需求背景 最近需要用到多线程, 自己维护线程池很麻烦, 正好看到Springboot集成线程池的例子, 这里自己做了个尝试和总结, 记录一下, 也分享给需要的朋友; 不考虑事务的情况下, 这个多线程实现比较简单, 主要有以下几点: 在启动类加上Enab…...

怎样接入chatGPT

官网链接&#xff1a; OpenAI platform...

Docker consul容器服务更新与发现

Docker consul容器服务更新与发现 一、什么事服务注册与发现二、什么是consul三、consul部署1、consul服务器2、registrator服务器3、consul-template 一、什么事服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可…...

[算法很美打卡] 多维数组篇 (打卡第一天)

文章目录 顺时针打印二维数组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…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...