【数据结构与算法】队列

文章目录

  • 一:队列
    • 1.1 队列的概念
    • 1.2 队列的介绍
    • 1.3 队列示意图
  • 二:数组模拟队列
    • 2.1 介绍
    • 2.2 思路
    • 2.3 代码实现
      • 2.3.1 定义队列基本信息
      • 2.3.2 初始化队列
      • 2.3.3 判断队列是否满,是否为空
      • 2.3.4 添加数据到队列
      • 2.3.5 获取队列数据,出队列
      • 2.3.6 显示队列所有数据
      • 2.3.7 显示队列头数据
      • 2.3.8 源码奉上
    • 2.4 测试ArrayQueue
    • 2.5 问题分析并优化
  • 三:数组模拟环形队列
    • 3.1 分析
    • 3.2 思路
    • 3.3 代码实现

一:队列

1.1 队列的概念

  • 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特点。
  • 入队列:进行插入操作的一端称为队尾 。
  • 出队列:进行删除操作的一端称为队头。

例如:比如生活中排队买东西,先排队的先购买

1.2 队列的介绍

  1. 队列是一个有序列表,可以用数组或是链表来实现。
  2. 遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出

1.3 队列示意图

在这里插入图片描述

二:数组模拟队列

2.1 介绍

  • 队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队列的最大容量。

  • 因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front及 rear分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear则是随着数据输入而改变,如图所示:

  • 在这里插入图片描述

2.2 思路

当我们将数据存入队列时称为”addQueue”,addQueue 的处理需要有两个步骤:思路分析

  1. 将尾指针往后移:rear+1 , 当front == rear 【空】
  2. 若尾指针 rear 小于队列的最大下标 maxSize-1,则将数据存入 rear所指的数组元素中,否则无法存入数据。 rear == maxSize - 1[队列满]

注:
rear 是队列最后[含]
front 是队列最前元素[不含]

2.3 代码实现

2.3.1 定义队列基本信息

 /*** 最大容量*/private int maxSize;/*** 队列头*/private int front;/*** 队列尾*/private int rear;/*** 该数组用于存放数据*/private int[] arr;

2.3.2 初始化队列

/*** 初始化队列构造器** @param arrMaxSize*/public ArrayQueue(int arrMaxSize) {maxSize = arrMaxSize;arr = new int[arrMaxSize];//指向队列头部的前一个位置,不包含头部front = -1;//指向队列尾部具体数据rear = -1;}

2.3.3 判断队列是否满,是否为空

/*** 判断队列是否满** @return*/public boolean isFull() {return rear == maxSize - 1;}/*** 判断队列是否为空** @return*/public boolean isEmpty() {return front == rear;}

2.3.4 添加数据到队列

public void addQueue(int n) {//判断队列是否满,满了就无法添加数据if (isFull()) {System.out.println("队列满了,无法添加数据");return;}//添加数据让rear后移rear++;arr[rear] = n;}

2.3.5 获取队列数据,出队列

  /*** 获取队列数据,出队列** @return*/public int getQueue() {//判断队列是否为空if (isEmpty()) {throw new RuntimeException("队列为空,无法取出数据");}front++;return arr[front];}

2.3.6 显示队列所有数据

   /*** 显示队列所有数据*/public void showQueue() {//判断队列是否为空if (isEmpty()) {System.out.println("队列为空,没有数据");}for (int i = 0; i < arr.length; i++) {System.out.printf("arr[%d]=%d\n", i, arr[i]);}}

2.3.7 显示队列头数据

 /*** 显示队列头数据** @return*/public int headQueue() {//判断队列是否为空if (isEmpty()) {throw new RuntimeException("队列为空,没有数据");}return arr[front + 1];}

2.3.8 源码奉上


/*** 队列头部输出数据,尾部输入数据*/
class ArrayQueue {/*** 最大容量*/private int maxSize;/*** 队列头*/private int front;/*** 队列尾*/private int rear;/*** 该数组用于存放数据*/private int[] arr;/*** 初始化队列构造器** @param arrMaxSize*/public ArrayQueue(int arrMaxSize) {maxSize = arrMaxSize;arr = new int[arrMaxSize];//指向队列头部的前一个位置,不包含头部front = -1;//指向队列尾部具体数据rear = -1;}/*** 判断队列是否满** @return*/public boolean isFull() {return rear == maxSize - 1;}/*** 判断队列是否为空** @return*/public boolean isEmpty() {return front == rear;}/*** 添加数据到队列*/public void addQueue(int n) {//判断队列是否满,满了就无法添加数据if (isFull()) {System.out.println("队列满了,无法添加数据");return;}//添加数据让rear后移rear++;arr[rear] = n;}/*** 获取队列数据,出队列** @return*/public int getQueue() {//判断队列是否为空if (isEmpty()) {throw new RuntimeException("队列为空,无法取出数据");}front++;return arr[front];}/*** 显示队列所有数据*/public void showQueue() {//判断队列是否为空if (isEmpty()) {System.out.println("队列为空,没有数据");}for (int i = 0; i < arr.length; i++) {System.out.printf("arr[%d]=%d\n", i, arr[i]);}}/*** 显示队列头数据** @return*/public int headQueue() {//判断队列是否为空if (isEmpty()) {throw new RuntimeException("队列为空,没有数据");}return arr[front + 1];}}

2.4 测试ArrayQueue

public class ArrayQueueDemo {public static void main(String[] args) {ArrayQueue queue = new ArrayQueue(3);//接收用户输入char key = ' ';Scanner scanner = new Scanner(System.in);boolean loop = true;while (loop) {System.out.println("s(show):显示队列");System.out.println("e(exit):退出程序");System.out.println("a(add):添加数据队列");System.out.println("g(get):取出数据队列");System.out.println("h(head):查看头队列数据");key = scanner.next().charAt(0);switch (key) {case 's':queue.showQueue();break;case 'a':System.out.println("输入一个数字");int value = scanner.nextInt();queue.addQueue(value);break;case 'g':try {int res = queue.getQueue();System.out.printf("取出的数据为%d\n",res);} catch (Exception e) {System.out.println(e.getMessage());}break;case 'h':try {int res = queue.headQueue();System.out.printf("队列头数据为%d\n",res);} catch (Exception e) {System.out.println(e.getMessage());}case 'e':scanner.close();loop = false;default:break;}}System.out.println("程序退出");}}

2.5 问题分析并优化

问题:目前数组使用一次就无法使用,没有达到复用的效果
优化:将数组改成环形队列,进行取模

三:数组模拟环形队列

3.1 分析

对前面的数组模拟队列的优化,充分利用数组。因此将数组看做是一个环形的。(通过取模的方式来实现即可)

3.2 思路

  1. front的含义做出如下调整:front就指向队列的第一个元素,即arr[front]就是队列的第一个元素。
  2. rear的含义做出如下调整:rear指向队列最后一个元素的后一个位置。空出一个空间做约定。
  3. 队列满的条件:(rear+1)%maxSize = front;
  4. 队列空的条件:rear == front;
  5. front和rear的初始值都为0;
  6. 队列中有效数据个数:(rear + maxSize - front)% maxSize;

3.3 代码实现

package com.sysg.dataStructuresAndAlgorithms.queue;import java.util.Scanner;public class CircleArrayQueueDemo {public static void main(String[] args) {//长度为4,有效长度为3,有一个预留的空间CircleArrayQueue queue = new CircleArrayQueue(4);//接收用户输入char key = ' ';Scanner scanner = new Scanner(System.in);boolean loop = true;while (loop) {System.out.println("s(show):显示队列");System.out.println("e(exit):退出程序");System.out.println("a(add):添加数据队列");System.out.println("g(get):取出数据队列");System.out.println("h(head):查看头队列数据");key = scanner.next().charAt(0);switch (key) {case 's':queue.showQueue();break;case 'a':System.out.println("输入一个数字");int value = scanner.nextInt();queue.addQueue(value);break;case 'g':try {int res = queue.getQueue();System.out.printf("取出的数据为%d\n",res);} catch (Exception e) {System.out.println(e.getMessage());}break;case 'h':try {int res = queue.headQueue();System.out.printf("队列头数据为%d\n",res);} catch (Exception e) {System.out.println(e.getMessage());}case 'e':scanner.close();loop = false;default:break;}}System.out.println("程序退出");}
}class CircleArrayQueue {/*** 最大容量*/private int maxSize;/*** 队列头* 1. front的含义做出如下调整:front就指向队列的第一个元素,即arr[front]就是队列的第一个元素。*/private int front;/*** 队列尾* 2. rear的含义做出如下调整:rear指向队列最后一个元素的后一个位置。空出一个空间做约定。*/private int rear;/*** 该数组用于存放数据*/private int[] arr;/*** 初始化队列构造器** @param arrMaxSize*/public CircleArrayQueue(int arrMaxSize) {maxSize = arrMaxSize;arr = new int[arrMaxSize];front = 0;rear = 0;}/*** 判断队列是否满** @return*/public boolean isFull() {//例:front = 1,rear = 5,maxSize = 5,此时队列就满了return (rear + 1) % maxSize == front;}/*** 判断队列是否为空** @return*/public boolean isEmpty() {return front == rear;}/*** 添加数据到队列*/public void addQueue(int n) {//判断队列是否满,满了就无法添加数据if (isFull()) {System.out.println("队列满了,无法添加数据");return;}//直接将数据加入arr[rear] = n;//将rear后移,这里必须考虑取模rear = (rear + 1) % maxSize;}/*** 获取队列数据,出队列** @return*/public int getQueue() {//判断队列是否为空if (isEmpty()) {throw new RuntimeException("队列为空,无法取出数据");}//这里需要分析出front是指向队列的第一个元素//1.先把front的值保存到一个临时的变量//2.将front后移,考虑取模//3.将临时变量保存int value = arr[front];front = (front + 1) % maxSize;return value;}/*** 显示队列所有数据*/public void showQueue() {//判断队列是否为空if (isEmpty()) {System.out.println("队列为空,没有数据");}//从front开始遍历,遍历多少个元素for (int i = front; i < front + getSize(); i++) {System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize]);}}/*** 获取有效数据大小* @return*/public int getSize() {return (rear + maxSize - front) % maxSize;}/*** 显示队列头数据** @return*/public int headQueue() {//判断队列是否为空if (isEmpty()) {throw new RuntimeException("队列为空,没有数据");}return arr[front];}}

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

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

相关文章

图数据库_Neo4j和SpringBoot整合使用_创建节点_删除节点_创建关系_使用CQL操作图谱---Neo4j图数据库工作笔记0009

首先需要引入依赖 springboot提供了一个spring data neo4j来操作 neo4j 可以看到它的架构 这个是下载下来的jar包来看看 有很多cypher对吧 可以看到就是通过封装的驱动来操作graph database 然后开始弄一下 首先添加依赖

【实用黑科技】如何 把b站的缓存视频弄到本地——数据恢复软件WinHex 和 音视频转码程序FFmpeg

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;效率…

Baumer工业相机堡盟工业相机如何通过BGAPISDK设置相机的固定帧率(C#)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的固定帧率&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的固定帧率功能的技术背景CameraExplorer如何查看相机固定帧率功能在BGAPI SDK里通过函数设置相机固定帧率 Baumer工业相机通过BGAPI SDK设置相机固定帧…

蓝牙资讯|中国智能家居前景广阔,蓝牙Mesh照明持续火爆

据俄罗斯卫星通讯社报道&#xff0c;中国已成为全球最大的智能家居消费国&#xff0c;占全球50%—60%的市场份额。未来&#xff0c;随着人工智能技术的发展以及智能家居生态的不断进步&#xff0c;智能家居在中国的渗透率将加速提升。德国斯塔蒂斯塔调查公司数据显示&#xff0…

win10系统docker创建ubuntu容器解决开发环境问题

一、win10系统使用docker的原因 最近啊&#xff0c;在学习人工智能-深度学习&#xff0c;用的win10系统进行开发&#xff0c;老是出现一些莫名其妙的问题&#xff0c;无法解决&#xff0c;每天都在为环境问题搞得伤透了脑筋。 说到底还是要使用Linux系统进行开发比较合适。 …

【MT32F006】MT32F006之HT1628驱动LED

本文最后修改时间&#xff1a;2023年03月30日 一、本节简介 本文介绍如何使用MT32F006连接HT1628芯片驱动LED。 二、实验平台 库版本&#xff1a;V1.0.0 编译软件&#xff1a;MDK5.37 硬件平台&#xff1a;MT32F006开发板&#xff08;主芯片MT32F006&#xff09; 仿真器&a…

LeetCode算法心得——限制条件下元素之间的最小绝对差(TreeSet)

大家好&#xff0c;我是晴天学长&#xff0c;今天用到了Java一个非常实用的类TreeSet&#xff0c;能解决一些看起来棘手的问题。 1 &#xff09;限制条件下元素之间的最小绝对差 2) .算法思路 初始化变量&#xff1a;n为列表nums的大小。 min为整型最大值&#xff0c;用于记录…

python3 0学习笔记之基本知识

0基础学习笔记之基础知识 &#x1f4da; 基础内容1. 条件语句 if - elif - else2. 错误铺捉try - except(一种保险策略&#xff09;3. 四种开发模式4. 函数&#xff1a;def用来定义函数的5. 最大值最小值函数&#xff0c;max &#xff0c;min6. is 严格的相等&#xff0c;is no…

机器学习:基本介绍

机器学习介绍 Hnad-crafted rules Hand-crafted rules&#xff0c;叫做人设定的规则。那假设今天要设计一个机器人&#xff0c;可以帮忙打开或关掉音乐&#xff0c;那做法可能是这样&#xff1a; 设立一条规则&#xff0c;就是写一段程序。如果输入的句子里面看到**“turn of…

C#__使用Type类反射数据的基本用法

// 简单介绍 // 元数据&#xff08;metadata&#xff09;&#xff1a;与程序及其类型有关的数据。 // 反射&#xff1a;一个运行的程序查看本身元数据或其他程序集中的元数据的行为 // Assembly类&#xff1a;允许访问给定程序集的元数据&#xff0c;包含了可以加载和执行程序…

【C# 基础精讲】文件读取和写入

文件读取和写入是计算机程序中常见的操作&#xff0c;用于从文件中读取数据或将数据写入文件。在C#中&#xff0c;使用System.IO命名空间中的类来进行文件读写操作。本文将详细介绍如何在C#中进行文件读取和写入&#xff0c;包括读取文本文件、写入文本文件、读取二进制文件和写…

选择大型语言模型自定义技术

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑器的3D应用场景 企业需要自定义模型来根据其特定用例和领域知识定制语言处理功能。自定义LLM使企业能够在特定的行业或组织环境中更高效&#xff0c;更准确地生成和理解文本。 自定义模型使企业能够创建符合其品牌…

BDA初级分析——认识SQL,认识基础语法

一、认识SQL SQL作为实用技能&#xff0c;热度高、应用广泛 在对数据分析人员的调查中SQL长期作为热度排名第-一的编程语言超过Python和R SQL&#xff1a;易学易用&#xff0c;高效强大的语言 SQL&#xff1a;Structured Query Language 结构化查询语言 SQL&#xff1a;易学…

多维时序 | MATLAB实现WOA-CNN-BiGRU-Attention多变量时间序列预测

多维时序 | MATLAB实现WOA-CNN-BiGRU-Attention多变量时间序列预测 目录 多维时序 | MATLAB实现WOA-CNN-BiGRU-Attention多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | MATLAB实现WOA-CNN-BiGRU-Attention多变量时间序列预测 1.程…

java 向上取整 java对小数取整

取整方法 Math.floor(double a) 向下取整 Math.ceil(double a) 向上取整 Math.round(double a) 四舍五入 0.5向下取整 Math.rint(double a) 就近取整 1.6接近2&#xff0c;所以就取2 1.4接近1&#xff0c;所以就取1 1.5跟1和2都很接近&#xff0c;这时候就取偶数 (int) 类型强转…

MongoDB:数据库初步应用

一.连接MongoDB 1.MongoDBCompass连接数据库 连接路径:mongodb://用户名:密码localhost:27017/ 2.创建数据库(集合) MongoDB中数据库被称为集合. MongoDBCompass连接后,点击红色框加号创建集合,点击蓝色框加号创建文档(数据表) 文档中的数据结构(相当于表中的列)设计不用管…

一个DW的计算

一个DW的计算 1- 题目: 已知一个DW1.1 要求: 从DW中取出指定的位的值1.1.1 分析1.1.2 实现1.1.3 简化实现1.1.4 验证 2- 题目: 已知一个DW2.1 要求: 从DW中的指定的P和S,取出指定的位的值2.1.1 分析2.1.2 实现 1- 题目: 已知一个DW 有图中所示一行信息&#xff0c;表示一个DW(…

常见的Web安全漏洞有哪些,Web安全漏洞常用测试方法介绍

Web安全漏洞是指在Web应用程序中存在的可能被攻击者利用的漏洞&#xff0c;正确认识和了解这些漏洞对于Web应用程序的开发和测试至关重要。 一、常见的Web安全漏洞类型&#xff1a; 1、跨站脚本攻击(Cross-Site Scripting&#xff0c;XSS)&#xff1a;攻击者通过向Web页面注入…

养生的年轻人,自己给自己“治病”

【潮汐商业评论/原创】 “最近嘴周总长痘&#xff0c;应该是上火了&#xff0c;我这就下单点金银花露喝。”对于长痘这件事&#xff0c;Anna的第一反应就是“内调”。 “针对性护肤和涂药这些方法治标不治本&#xff0c;就算用完痘痘不泛红且瘪了&#xff0c;身体里的问题没解…

金蝶软件实现Excel数据复制分录信息粘贴到单据体分录行中

>>>适合KIS云专业版V16.0|KIS云旗舰版V7.0|K/3 WISE 14.0等版本<<< 实现Excel数据复制分录信息粘贴到金蝶单据体分录中,在采购订单|采购入库单|销售订单|销售出库单等类型单据中,以少量的必要字段在excel表格中按模板填列好,很方便快捷地复制到金蝶单据表体…