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…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...

VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

Mysql故障排插与环境优化
前置知识点 最上层是一些客户端和连接服务,包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念,为通过安全认证接入的客户端提供线程。同样在该层上可…...

算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...