数据结构——队列(包括循环队列)——Java版

目录

队列介绍:

基本概念:

应用:

Java实现示例:

循环队列的Java实现:


队列介绍:

队列(Queue)是一种常见的数据结构,它按照先进先出(FIFO,First-In-First-Out)的原则管理数据。在现实生活中,队列的概念很容易理解,就像是排队等待服务的人群一样。在计算机科学领域,队列同样扮演着重要的角色,在算法和程序设计中被广泛应用。

基本概念:

1. 入队和出队
队列的两个主要操作是入队(enqueue)和出队(dequeue)。入队指将元素添加到队列的末尾,而出队则是从队列的头部移除一个元素。这两个操作遵循FIFO原则,即先入队的元素会先被出队。

2. 队首和队尾
队列中的第一个元素称为队首(front),而最后一个元素称为队尾(rear)。入队操作会将元素添加到队尾,而出队操作会移除队首元素。

应用:

 1. 算法中的应用
队列在算法中有着广泛的应用,特别是在图的遍历、广度优先搜索(BFS)、迷宫求解等问题中。它们通常用于管理待处理的节点或状态,以确保按照正确的顺序进行处理。

2. 数据结构中的应用
队列可以作为其他数据结构的基础,例如实现线程池、任务调度器、缓冲区等。在这些应用中,队列用于存储待处理的任务或数据,并按照先进先出的顺序进行处理。

Java实现示例:

注意:此队列使用了动态数组可以自动扩容,避免了固定大小数组的限制,如果想用静态数组可以在代码的基础上修改一下,这里我就不展示了

另外,此队列代码实现运用了泛型的相关知识,对泛型还不太了解的小伙伴,可以看一下我下期作品:深入探究Java中的泛型

public class Queue<T> {private T[] elements; // 用于存储队列元素的数组private int front; // 指向队列头部的指针private int rear; // 指向队列尾部的指针private int size; // 队列中元素的数量private static final int DEFAULT_CAPACITY = 10; // 默认初始容量private static final int RESIZE_FACTOR = 2; // 扩容因子// 构造函数,初始化队列public Queue() {elements = (T[]) new Object[DEFAULT_CAPACITY];front = 0;rear = -1;size = 0;}// 入队操作,将元素添加到队尾public void enqueue(T element) {// 检查队列是否需要扩容if (size == elements.length) {resize();}// 队尾指针移动并添加元素rear = (rear + 1) % elements.length;elements[rear] = element;size++;}// 出队操作,从队首移除元素并返回public T dequeue() {// 检查队列是否为空if (isEmpty()) {throw new IllegalStateException("队列为空");}// 获取队首元素并移动队首指针T element = elements[front];front = (front + 1) % elements.length;size--;return element;}// 获取队首元素,但不移除public T peek() {// 检查队列是否为空if (isEmpty()) {throw new IllegalStateException("队列为空");}return elements[front];}// 检查队列是否为空public boolean isEmpty() {return size == 0;}// 获取队列大小public int size() {return size;}// 扩容队列private void resize() {int newCapacity = elements.length * RESIZE_FACTOR;T[] newElements = (T[]) new Object[newCapacity];for (int i = 0; i < size; i++) {newElements[i] = elements[(front + i) % elements.length];}elements = newElements;front = 0;rear = size - 1;}
}
循环队列的Java实现:

循环利用数组空间: 循环队列通过循环利用数组空间,避免了因队列元素出队导致的空间浪费问题。

入队、出队操作高效: 循环队列的入队和出队操作时间复杂度均为 O(1),因为它们只涉及修改队尾指针和队首指针,并不需要移动数组元素。

固定大小: 循环队列通常具有固定的大小,一旦初始化后大小不会改变。
 

public class CircularQueue<T> {private T[] elements; // 用于存储队列元素的数组private int front; // 队列头部指针,指向队首元素private int rear; // 队列尾部指针,指向队尾元素的下一个位置private int size; // 队列中元素的数量private static final int DEFAULT_CAPACITY = 10; // 默认初始容量// 默认构造函数,创建指定容量的循环队列public CircularQueue() {elements = (T[]) new Object[DEFAULT_CAPACITY];front = 0;rear = -1;size = 0;}// 带有容量参数的构造函数,创建指定容量的循环队列public CircularQueue(int capacity) {elements = (T[]) new Object[capacity];front = 0;rear = -1;size = 0;}// 入队操作,将元素添加到队尾public void enqueue(T element) {// 检查队列是否已满if (isFull()) {throw new IllegalStateException("队列已满");}// 计算新的rear位置rear = (rear + 1) % elements.length;elements[rear] = element;size++;}// 出队操作,从队首移除元素并返回public T dequeue() {// 检查队列是否为空if (isEmpty()) {throw new IllegalStateException("队列为空");}T element = elements[front];// 移动front指针front = (front + 1) % elements.length;size--;return element;}// 获取队首元素,但不移除public T peek() {if (isEmpty()) {throw new IllegalStateException("队列为空");}return elements[front];}// 检查队列是否为空public boolean isEmpty() {return size == 0;}// 检查队列是否已满public boolean isFull() {return size == elements.length;}// 获取队列大小public int size() {return size;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/791407.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux中的shell脚本之流程控制循环遍历

3 条件判断 4 流程控制语句 1&#xff09;if 语句 案例&#xff0c;用户输入用户名和密码&#xff0c;判断用户名是否是admin,密码是否是123,如果正确&#xff0c;则显示登录成功 首先我创建了shell文件&#xff0c;touch getpawer 其中getpawer 是我自己命的名 #!/bin/bas…

Linux-4 gcc和makefile

Linux编译器-gcc/g使用 1.设计样例 c语言&#xff1a;linux中用的stdc99版本--可能会出现其他问题 c&#xff1a;Linux中用的stdc11--使用c11版本 Linux没有文件格式的区分&#xff0c;但是编译器区分 gcc编译器的文件格式是filename.c g编译器的文件格式是filename.cc或者fil…

C语言--指针4

大家节日快乐&#xff0c;难得的假期&#xff0c;祝你们玩得开心。 今天总结了指针第四部分。 1.回调函数是什么 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另⼀个函数&#xff0c;当这个指针被⽤来调⽤其所指…

公约数(acwing每日一题)

题目描述&#xff1a; 给定两个正整数 a 和 b。 你需要回答 q个询问。 每个询问给定两个整数 l,r&#xff0c;你需要找到最大的整数 x&#xff0c;满足&#xff1a; x 是 a 和 b的公约数。l≤x≤r。 输入格式&#xff1a; 第一行包含两个整数 a,b。 第二行包含一个整数 …

蓝桥杯练习笔记(十七)

蓝桥杯练习笔记&#xff08;十七&#xff09; 一、 输入样例 7 7 1000001 0100010 0010100 0001AAA 00010A0 00010A0 00010A0蓝桥官网题解&#xff1a; 该题解是用了三个循环分别对三个方向的相同字符的长度进行统计&#xff0c;找出最大长度&#xff0c;最后对找出的最长Y进…

做好产品定位的3个重点

产品定位对于项目而言至关重要&#xff0c;正确的产品定位有助于项目锁定目标市场&#xff0c;精准满足客户需求。通过差异化产品策略&#xff0c;让产品在众多竞品中脱颖而出&#xff0c;形成独特竞争优势&#xff0c;从而有助于产品价值的实现。 因此做好产品定位迫在眉睫&am…

在Go语言中如何调试

调试是确定程序为何不像预期那样工作的过程。程序不像预期那样工作的迹象有很多,包括编译错误、运行阶段错误、文件权限错误以及数据不正确等。调试是程序员经常需要做的工作,而要理解Go语言,就必须明白它提供了哪些工具。使用Go语言开发复杂的程序时,调试将成为日常工作中…

POI、EasyExcel操作Excel表格详解

POI、EasyExcel 文章目录 POI、EasyExcel1.简介2.结构3.POI-Excel写1.基本操作2.大文件写入HSSF3.大文件写入XSSF4.大文件写入SXSSF 4.POI-Excel读1.基本操作2.数据类型3.计算公式类型数据读取 5.EasyExcel写1.基本写入操作2.日期、数字或者自定义格式转换3.列宽、行高 6.EasyE…

软件杯 深度学习中文汉字识别

文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习中文汉字识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xf…

【Linux】从零认识文件操作

送给大家一句话&#xff1a; 要相信&#xff0c;所有的不美好都是为了迎接美好&#xff0c;所有的困难都会为努力让道。 —— 简蔓《巧克力色微凉青春》 开始理解基础 IO 吧&#xff01; 1 前言2 知识回顾3 理解文件3.1 进程和文件的关系3.2 文件的系统调用openwrite文件 fd 值…

OpenHarmony实战:小型系统平台驱动移植

在这一步&#xff0c;我们会在源码目录//device/vendor_name/soc_name/drivers目录下创建平台驱动。 建议的目录结构&#xff1a; device ├── vendor_name │ ├── drivers │ │ │ ├── common │ │ │ ├── Kconfig # 厂商驱动内核菜单入口 │ …

七大开源基金会联合制定符合 CRA 法案的共同标准

欧洲议会上个月通过的《欧洲网络弹性法案》(CRA) 制定通用规范和标准 Apache 软件基金会、Blender 基金会、Eclipse 基金会、OpenSSL 软件基金会、PHP 基金会、Python 软件基金会 和 Rust 基金会 这项工作由 Eclipse 基金会牵头&#xff0c;旨在建立基于现有开源最佳实践的安全…

yolov8训练流程

训练代码 from ultralytics import YOLO# Load a model model YOLO(yolov8n.yaml) # build a new model from YAML model YOLO(yolov8n.pt) # load a pretrained model (recommended for training) model YOLO(yolov8n.yaml).load(yolov8n.pt) # build from YAML and tr…

巧用lambda表达式构建各种“树”

简述 利用jdk8 lambda表达式分组函数&#xff0c;可巧妙构建各种树&#xff0c;比如地区树&#xff0c;可以利用其多线程特性充分利用CPU提高性能。 分组函数&#xff1a;Collectors.groupingBy() 开起多线程&#xff1a;list.parallelStream() 实例 以地区为例&#xff1…

9.图像中值腐蚀膨胀滤波的实现

1 简介 在第七章介绍了基于三种卷积前的图像填充方式&#xff0c;并生成了3X3的图像卷积模板&#xff0c;第八章运用这种卷积模板进行了均值滤波的FPGA实现与MATLAB实现&#xff0c;验证了卷积模板生成的正确性和均值滤波算法的MATLAB算法实现。   由于均值滤波、中值滤波、腐…

leet hot 100-13 最大子数组和

53. 最大子数组和 原题链接思路代码 原题链接 leet hot 100-10 53. 最大子数组和 思路 生成一个数字来记录last 表示前面数字全部之和与0取最大值 如果大于0 就加上如果不大于0 就不管 从当前位置从新开始遍历计算 时间复杂度O(n) 空间复杂度(1) 代码 class Solution {…

JVM剖析

0.前言 Java 是当今世界使用最广泛的技术平台之一。使用 Java 或 JVM 的一些技术包括&#xff1a; Apache spark用于大数据处理&#xff0c;数据分析在JVM上运行;用于数据流的Apache NiFi在内部使用的也是 JVM;现代 Web 和移动应用程序开发中使用的React native使用 的也包含…

Boost编译使用

Boost编译使用 文章目录 Boost编译使用写在前面测试环境 下载编译目录结构直接使用手动编译Boost.Build编译 参考 使用Vs中使用Qt中使用CMake中使用代码中使用 写在前面 Boost 是一个非常强大的 C 开源库,提供了许多高质量的、经过良好测试的 C 组件。 Boost 的主要特点包括广…

HTTPS RSA 握手解析(计算机网络)

传统的 TLS 握手基本都是使用 RSA 算法来实现密钥交换的&#xff0c;在将 TLS 证书部署服务端时&#xff0c;证书文件其实就是服务端的公钥&#xff0c;会在 TLS 握手阶段传递给客户端&#xff0c;而服务端的私钥则一直留在服务端。 在 RSA 密钥协商算法中&#xff0c;客户端会…

佳能打印机E568扫描书和文件方法

官方网站; Canon : Inkjet 手册 : IJ Scan Utility : 启动IJ Scan Utility 打开打印机电源 扫描一个文件&#xff0c;翻页后盖好盖子。再点击扫描。 所有扫描结束之后点退出 点击保存