【尚硅谷】Java数据结构与算法笔记02 - 队列

news2024/11/23 8:03:16

文章目录

  • 一、使用场景
  • 二、队列介绍
  • 三、数组模拟队列
    • 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为4
        ArrayQueue 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为4
        CircleArrayQueue 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

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

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

相关文章

硬盘压缩将C盘拓展成D盘和E盘

硬盘压缩将C盘拓展成D盘和E盘1. 现状2. 硬盘压缩2.1 进入计算机管理2.2 磁盘管理压缩卷3. 分配新盘符3.1 查看盘符是否被占用3.2 新建D盘刚安装好系统的电脑有可能只有一个C盘,我们工作学习的时候远远不够,那怎么拓展其他盘符呢? 接下来让我们…

PyQt5基础练习1

0. 本文学习地址 1. PyQt5是由一系列Python模块组成 超过620个类,6000函数和方法。能在诸如Unix、Windows和Mac OS等主流操作系统上运行。 1.1 PyQt5有两种证书 GPL商业证书 2. 实验1 实现简单的窗体 2.1 完整代码 #!/usr/bin/python3 # -*- coding: utf-8 -*…

专业尖端远心光学,高精度视觉检测解决者

随着机器视觉系统在精密检测领域的广泛应用,在精密光学测量系统中,由于普通光学镜头会存在一定的制约因素,如影像的变形、视角选择而造成的误差、不适当光源干扰下造成边界的不确定性等问题,进而影响测量的精度。为弥补普通镜头应…

155. RESTframe的请求和响应

1.请求和响应 REST framework引入了2个新的对象:Request和Response 1.1 Request 包结构:rest_framework.request.Request 该对象扩展了常规的HttpRequest ,增加了对REST框架灵活的请求解析和请求认证的支持 主要属性: data 这个…

基于PHP+MySQL毕业生档案管理系统

毕业生档案管理系统是信息时代的产物,它是学校档案管理部门的一个好帮手。有了它不再需要繁重的纸质登记,有了它档案管理员不在需要繁重的工作,一些成绩信息和奖惩等基本信息可以由管理人员及时的对信息进行查询、更新、修改和删除&#xff0…

SpringBoot_启动原理分析

一共分为三部分来解析: 一 依赖导入原理 二 springboot 包扫描原理三 springboot自动配置原理一 依赖导入原理 父项目进行版本控制 ctrl 点击spring-boot-starter-parent 进入 继续点击,进入spring-boot-dependencies 这里管理着springboot中所有依赖的版本,版本…

38 | Linux 磁盘空间异常爆满

1 场景 收到告警 找到对应的服务器:df -hl 要找到导致磁盘空间满的目录或文件。 2 找占用空间大的目录或文件 2.1方式一 在根目录下,通过du -hs命令,列出各目录所占空间大小 命令:du -hs * 之后再用同样的方法继续到对应目…

[附源码]计算机毕业设计springboot医学图像管理平台

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

EXSI-NFS实验

A-EXSI-NFS实验 2022年3月25日 8:20 iptables -F iptables-save systemctl stop firewalld #setenforce [0|1]命令修改SELinux当前的运行模式(0为禁用,1为启用) getenforce Enforcing setenforce 0 getenforce Permissive NFS 两台CentOS 7即…

【车载开发系列】UDS诊断---读取内存($0x23)

【车载开发系列】UDS诊断—读取内存($0x23) UDS诊断---读取内存($0x23)【车载开发系列】UDS诊断---读取内存($0x23)一.概念定义二.注意事项三.报文格式1)报文请求2)肯定响应3&#x…

一、Node.js 环境安装 (详)

1. 下载Node.js 首先进入node.js官网,选择下载这一项,此时映入眼帘的可以看到有两项LTS(长期维护版本)和Current(最新的版本),一般在开发会选择左边进行下载安装,具稳定性以及有长期维护。那么下面演示的是64位的Windows操作系统&…

PCI bar 解析

只要是接入系统的 pci 设备就需要和系统软件进行交互,设备和系统之间的交流主要包含以下两部分: 1,系统要能访问到设备的寄存器 用于控制设备行为,包括DMA,数据收发等;设备通过寄存器报告自身的状态&…

Nginx部署vue项目和配置代理

Nginx部署vue项目和配置代理目录概述需求:实现思路分析1.一般前后端分离的项目需要进行跨域2.微服务代理3.vuenginx实现服务端跨域4.网页解析器参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&am…

【问题解决】Android JDK版本不匹配导致崩溃踩坑记录

【问题解决】Android JDK版本不匹配导致崩溃踩坑记录部分机型反馈崩溃问题谷歌回复与解决方案Android打包脱糖操作对比与排查总结前几天同事遇到一个非常诡异的报错,紧急处理后,趁着周末仔细研究了一下原因,觉得还挺有意思的,所以…

制作一个谷歌浏览器插件,实现网页数据爬虫

一、什么是浏览器插件 浏览器插件,基于浏览器的原有功能,另外增加新功能的工具,是可定制浏览体验的小型软件程序,让用户可以根据个人需要或偏好来定制浏览器。 如拦截网页中的广告、划词翻译、倍速视频等等。 Chrome、edge等浏…

WEB前端网页设计 网页代码参数(背景、图片)类

目录 设置圆角 旋转属性: box-sizing属性: 设置背景图像固定background-attachment 设置多重背景图像 鼠标光标形状:cursor ”图片背景“ background-size 背景图片的大小 背景图像的位置 px 无序列表 : 标签 项目符…

解决cocos2d-x-4.0 Android Demo构建遇到的问题

环境 硬件:macbook pro 四核Intel Core i7系统:macOS Big Sur 11.4.2、 xcode Version 13.1 、cmake 3.20.5软件:iterm2 Build 3.4.8、zsh 5.8、Android Studio Dolphin | 2021.3.1cocos2d-x v4 : 官方下载压缩包 http://cocos2d…

讲点登录业务

1.单点Session 通过判断用户是否有服务器赋予的session_id,点对点服务器的用户信息,确认用户身份 缺点: 单点性能压力大无法扩展,如果是分布式的话,其他的服务怎么进行认证呢? 2.Redis解决共享问题 我们…

JavaWeb(四)

前言 在学习JSP之前,首先咱们要了解的是,学这个语言有什么用,这个语言用在哪里呢? 这就要从咱们的MVC框架开始讲起 MVC模式是一种软件架构模式,对于我这种软件工程专业的人来说,真的是逃离不了学这个东西。…

Java_题目_学生管理系统_注册登录忘记密码

学生管理系统升级版 Java_题目_学生管理系统_业务分析并搭建主菜单_查询添加删除修改 需求: ​ 为学生管理系统书写一个登陆、注册、忘记密码的功能。 ​ 只有用户登录成功之后,才能进入到学生管理系统中进行增删改查操作。 分析: 登录…