【尚硅谷】Java数据结构与算法笔记02 - 队列
创始人
2024-03-16 04:24:33
0

文章目录

  • 一、使用场景
  • 二、队列介绍
  • 三、数组模拟队列
    • 3.1 思路分析
    • 3.2 Java代码实现
    • 3.3 问题分析与优化
  • 四、数组模拟环形队列
    • 4.1 思路分析
    • 4.2 Java代码实现


一、使用场景

  • 银行排队,先到先得
  • 测核酸,先到先测
    在这里插入图片描述

二、队列介绍

  1. 队列是一个有序列表, 可以用数组或是链表来实现。
  2. 遵循先入先出的原则。即: 先存入队列的数据, 要先取出。后存入的要后取出
  3. 示意图: (使用数组模拟队列示意图)
    在这里插入图片描述

三、数组模拟队列

3.1 思路分析

  • 队列本身是有序列表, 若使用数组的结构来存储队列的数据, 则队列数组的声明如下图, 其中 maxSize 是该队 列的最大容量。
  • 因为队列的输出、输入是分别从前后端来处理, 因此需要两个变量 front 及 rear 分别记录队列前后端的下标, front 会随着数据输出而改变, 而 rear则是随着数据输入而改变, 如图所示:

在这里插入图片描述

当我们将数据存入队列时称为” addQueue”, addQueue 的处理需要有两个步骤: 思路分析
1)将尾指针往后移: rear +1+1+1, 当 front ====== rear 【空】
2)若尾指针 rear 小于队列的最大下标 maxSize-1, 则将数据存入 rear 所指的数组元素中, 否则无法存入数据。 rear ==max⁡==\max==max Size −1-1−1 [队列满]

3.2 Java代码实现

public class ArrayQueue {public static void main(String[] args) {// 1. 声明数组模拟的队列,设置maxSize为4ArrayQueue arrayQueue = new ArrayQueue(4);// 2. 开始测试arrayQueue.add(1);arrayQueue.add(3);arrayQueue.add(4);arrayQueue.add(2);arrayQueue.add(5);System.out.println(arrayQueue.poll());System.out.println(arrayQueue.poll());System.out.println(arrayQueue.poll());System.out.println(arrayQueue.poll());System.out.println(arrayQueue.poll());}// 数组长度(队列的最大容量)int maxSize;// 当前队列长度int curSize;// 数组int[] arr;// 当前指向的元素int curIndex;public ArrayQueue(int maxSize) {this.maxSize = maxSize;arr = new int[maxSize];curIndex = 0;curSize = 0;}// 添加元素到队列public void add(int num) {if (curSize >= maxSize) {System.err.println("队列容量不足,无法添加元素");}else{arr[curSize++] = num;}}// 从队列取出头元素public int poll() {if (curIndex >= curSize) {throw new RuntimeException("当前队列为空,无法取出元素");}else if (curIndex >= maxSize) {throw new RuntimeException("超出队列长度");}else{return arr[curIndex++];}}}

输出:

队列容量不足,无法添加元素
1
3
4
2
Exception in thread "main" java.lang.RuntimeException: 当前队列为空,无法取出元素at com.wskh.DataStructures.Queue.ArrayQueue.poll(ArrayQueue.java:57)at com.wskh.DataStructures.Queue.ArrayQueue.main(ArrayQueue.java:26)

3.3 问题分析与优化

  1. 目前数组使用一次就不能用, 没有达到复用的效果
  2. 将这个数组使用算法, 改进成一个环形的队列 取模:%

四、数组模拟环形队列

4.1 思路分析

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

  1. 尾索引的下一个为头索引时表示队列满, 即将队列容量空出一个作为约定, 这个在做判断队列满的 时候需要注意 ((( rear +1)%+1) \%+1)% maxSize === front 满]
  2. rear ====== front [[[ 空 ]]]
  3. 分析示意图:

在这里插入图片描述

4.2 Java代码实现

public class CircleArrayQueue {public static void main(String[] args) {// 1. 声明数组模拟的队列,设置maxSize为4CircleArrayQueue circleArrayQueue = new CircleArrayQueue(4);// 2. 开始测试circleArrayQueue.add(1);circleArrayQueue.add(3);circleArrayQueue.add(4);System.out.println(circleArrayQueue.poll());System.out.println(circleArrayQueue.poll());circleArrayQueue.add(2);circleArrayQueue.add(5);System.out.println(circleArrayQueue.poll());System.out.println(circleArrayQueue.poll());System.out.println(circleArrayQueue.poll());}// 数组长度(队列的最大容量)int maxSize;// 当前队列长度int curSize;// 当前追加的指针int addIndex;// 数组Integer[] arr;// 当前指向的元素int curIndex;public CircleArrayQueue(int maxSize) {this.maxSize = maxSize;arr = new Integer[maxSize];curIndex = 0;curSize = 0;addIndex = 0;}// 添加元素到队列public void add(int num) {if (curSize >= maxSize) {System.err.println("队列容量不足,无法添加元素");} else {arr[(addIndex++) % maxSize] = num;}}// 从队列取出头元素public int poll() {if (arr[curIndex % maxSize] == null) {throw new RuntimeException("当前队列为空,无法取出元素");} else {curSize--;Integer integer = arr[curIndex % maxSize];arr[curIndex % maxSize] = null;curIndex++;return integer;}}}

输出:

1
3
4
2
5

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...