数据结构与算法—队列
队列
队列介绍
有序列表,可以用数组或者链表实现。遵循先进先出原则。
数组实现队列
public class ArrayQueue {public static void main(String[] args) {ArrayQueue queue = new ArrayQueue(3);// 接收用户输入char key =' ';Scanner sc = 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 = sc.next().charAt(0);switch (key) {case 's':queue.showQueue();break;case 'a':System.out.println("输出一个数:");queue.addQueue(sc.nextInt());break;case 'g':try {int res = queue.getQueue();System.out.printf("取出的数据是:%d\n", res);} catch (Exception e) {System.out.printf(e.getMessage());}break;case 'h':try {int res = queue.head();System.out.printf("头数据是:%d\n", res);} catch (Exception e) {System.out.printf(e.getMessage());}break;case 'e':sc.close();loop = false;break;default:break;}System.out.println("程序退出~~");}}// 数组的最大容量private int maxSize;// 队头private int front;// 队尾private int rear;// 存放数据的数组private int[] arr;// 初始化队列public ArrayQueue(int maxSize) {this.maxSize = maxSize;this.arr = new int[this.maxSize];// 让front 指向队列头的前一个位置(队列头数据的前一个位置)this.front = -1;// 让rear 指向队尾的数据(队列的最后一个数据)this.rear = -1;}// 判断队列是否满public boolean isFull() {return rear == maxSize - 1;}// 判断队列是否为空public boolean isEmpty() {return rear == front;}public void addQueue(int data) {if (isFull()) {System.out.println("队列满,不能加数据~");return;}rear++;arr[rear] = data;}public int getQueue() {if (isEmpty()) {throw new RuntimeException("队列空,无法取出数据~");}front++;return arr[front];}public void showQueue() {if (isEmpty()) {System.out.println("队列空,没有数据~");return;}for (int i = 0; i < arr.length; i++) {System.out.printf("arr[%d]=%d\n", i, arr[i]);}}public int head() {if (isEmpty()) {throw new RuntimeException("队列空,没有头数据~");}return arr[front + 1];}
}
通过该方法测试


添加了:10,20,30
show:arr[0]=10,arr[1]=20,arr[2]=30

取出10后,头数据是20。这时候show一下,可以看到队列为:arr[0]=10,arr[1]=20,arr[2]=30

也就是我们通过g获取到了数据,看到队列数据还是一样。
为了可以重新使用已经出队的数据所占用的空间,考虑使用环形队列。
数组环形队列

public class CircleArrayQueue {public static void main(String[] args) {CircleArrayQueue queue = new CircleArrayQueue(3);// 接收用户输入char key =' ';Scanner sc = 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 = sc.next().charAt(0);switch (key) {case 's':queue.showQueue();break;case 'a':System.out.println("输出一个数:");queue.addQueue(sc.nextInt());break;case 'g':try {int res = queue.getQueue();System.out.printf("取出的数据是:%d\n", res);} catch (Exception e) {System.out.printf(e.getMessage());}break;case 'h':try {int res = queue.head();System.out.printf("头数据是:%d\n", res);} catch (Exception e) {System.out.printf(e.getMessage());}break;case 'e':sc.close();loop = false;break;default:break;}System.out.println("程序退出~~");}}// 数组的最大容量private int maxSize;// 让front 指向队列的第一个元素// front = 0;// 让rear 指向队列的最后一个元素的后一个位置,因为希望空出一个空间作为约定// rear = 0;private int front;private int rear;// 存放数据的数组private int[] arr;// 初始化队列public CircleArrayQueue(int maxSize) {this.maxSize = maxSize;this.arr = new int[maxSize];}// 判断队列是否满public boolean isFull() {return (rear + 1) % maxSize == front;}// 判断队列是否为空public boolean isEmpty() {return rear == front;}// 添加数据public void addQueue(int data) {if (isFull()) {System.out.println("队列满,不能加数据~");return;}arr[rear] = data;// rear 后移,因为是环形,考虑取模rear = (rear + 1) % maxSize;}public int getQueue() {if (isEmpty()) {throw new RuntimeException("队列空,无法取出数据~");}// 因为front 是队列第一个元素,也会后移,考虑取模,以免越界// 1.先保存front 指向的值到valueint value = arr[front];// 2.front 后移,并返回valuefront = (front + 1) % maxSize;return value;}public void showQueue() {if (isEmpty()) {System.out.println("队列空,没有数据~");return;}// 因为是环形队列,需要考虑从front 开始遍历,遍历队列的有效数据个数for (int i = front; i < front + size(); i++) {System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize]);}}// 当前队列的有效数据个数public int size() {return (rear + maxSize - front) % maxSize;}public int head() {if (isEmpty()) {throw new RuntimeException("队列空,没有头数据~");}return arr[front];}
}
测试:
添加数据10,20,30,show一下,添加40提示队列满


取出arr[0] 后,show一下,可以看到队列还剩两个数据

这时,又可以在arr[0] 的位置插入新数据。


这样,就可以利用好了数组空间。
最近学习的数据结构与算法主要都是根据尚硅谷的学习:
https://www.bilibili.com/video/BV1E4411H73v/?p=18&vd_source=8e23c01ff3b88e176530ca2e0f4f18fe
可以看看我的个人博客:
网站:https://www.fuzm.wang / https://liwangc.gitee.io
—————————————————————————
作为初学者,很多知识都没有掌握,见谅,如有错误请指出,以期进步,感谢!。后续有新的学习,继续补充上来。
相关文章:
数据结构与算法—队列
队列 队列介绍 有序列表,可以用数组或者链表实现。遵循先进先出原则。 数组实现队列 public class ArrayQueue {public static void main(String[] args) {ArrayQueue queue new ArrayQueue(3);// 接收用户输入char key ;Scanner sc new Scanner(System.in);…...
AcWing3416.时间显示——学习笔记
目录 题目 代码 AC结果 思路 关键步骤 题目 3416. 时间显示 - AcWing题库https://www.acwing.com/problem/content/description/3419/ 代码 import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input new Scanner(System.in…...
贴吧手机端防删图GIF动态图制作解析
贴吧存活 思路技术运气 1:防删图不是存活的绝对因素,除了防删图,还有账号,ip,内容,吧的问题 2:一个图不是每个吧都可以发 3:一个贴不被删不仅仅看图片 4:有时候运气也很…...
iOS接入Google登录
1.在Google Cloud后台配置客户端ID 首先要在 Google Cloud 中创建一个项目。新创建的Project需要先配置同意屏幕。一共有4步骤需要配置。 1.OAuth 同意屏幕 User Type选择"外部"进行创建。填写必必要的信息,应用名称、用户支持电子邮件地址、开发者电子邮…...
【C语言】大小端字节序问题
一、大小端字节序问题 大小端是由CPU决定的,大小端可以理解为字节顺序,所以大小端全称叫大端字节序、小端字节序。其实大端、小端这两个词是从《格列佛游记》里出来的。《格列佛游记》有一段讲的是吃鸡蛋是从大的那头敲开还是小的那头敲开的问题…...
Linux | 网络通信 | 序列化和反序列化的讲解与实现
文章目录为什么要序列化?协议的实现服务端与客户端代码实现为什么要序列化? 由于默认对齐数的不同,不同的平台对相同数据进行内存对齐后,可能得到不同的数据。如果直接将这些数据进行网络传输,对方很可能无法正确的获…...
C#的委托原理刨析and事件原理刨析和两者的比较
什么是委托委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。 在实例化委托时,你可以将其实例与任何具有兼容参数和返回类型的方法进行绑定。 你可以通过委托实例调用方法。简单的理解,委托是方法的抽象类,它定…...
Redis学习【8】之Redis RDB持久化
文章目录Redis 持久化1 持久化基本原理2 RDB(Redis DataBase) 持久化2.1 持久化的执行2.2 手动 save 命令2.3 手动 bgsave 命令2.4 自动条件触发2.5 查看持久化时间3 RDB 优化配置3.1 save3.2 stop-write-on-bgsave-error3.3 rdbcompression3.4 rdbchecksum3.5 sanitize-dump-p…...
SpringSecurity认证
文章目录登陆校验流程依赖yaml实现建表、工具类、实体类加密器、AuthenticationManager登录逻辑登录过滤器、配置过滤器登出登陆校验流程 认证 登录: ①自定义登录接口 调用ProviderManager的方法进行认证 如果认证通过生成token,根据userId把用…...
Socket套接字
概念 Socket套接字,是由系统提供用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元。基于Socket套接字的网络程序开发就是网络编程。 分类 Socket套接字主要针对传输层协议划分为如下三类: 流套接字:使用传输层TCP…...
mysql详解之innoDB
索引 Mysql由索引组织,所以索引是mysql多重要概念之一。 聚簇索引 InnoDB和MyISAm一样都是采用B树结构,但不同点在于InnoDB是聚簇索引(或聚集索引),将数据行直接放在叶子节点后面。 这里可能存在一个误区࿱…...
电信运营商的新尝试:探索非通信领域的发展
近年来,随着电信运营商竞争的日趋激烈和网络建设的成本不断攀升,许多电信运营商已经开始缩减IT投资。然而,在如此情况下,电信运营商仍然需要寻找新的增长机会。那么,在持续缩减IT投资的情况下,电信运营商可…...
第07章_单行函数
第07章_单行函数 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. 函数的理解 1.1 什么是函数 函数在计算机语言的使用中贯穿始终,函数的作用是什么呢?它可以把我们经…...
Echarts实现多柱状图重叠重叠效果
有两种重叠效果: 1. 多个柱子重叠为一个 2. 多个柱子重叠为两组 第一种,图例: 这个灰色不是阴影哦, 是柱子. 1. 使用详解 (1) series.Z 折线图组件的所有图形的 z 值。控制图形的前后顺序。 z 值小的图形会被 z 值大的图形覆盖。z 相比 zlevel 优先级更低,而且不会…...
PHP学习笔记(一谦四益)
前言 上一篇文章 PHP学习笔记(观隅反三)分享了数组的知识,这篇文章接着分享和数组相关的算法。 算法效率 算法效率分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称…...
Jvm -堆对象的划分
堆对于一个jvm进程来说是唯一的,一个进程只有一个jvm,但是进程半酣多个线程,多个线程共享一个堆。 也就是说,一个jvm实例只存在一个堆,同时对也是Java内存管理的核心区域。 Java堆区域的大小在jvm启动时就已经被确定…...
2023美赛F题讲解+数据领取
我们给大家准备了F题的数据,免费领取!在文末 国内生产总值(GDP)可以说是一个国家经济健康状况最著名和最常用的指标之--。它通常用于确定一个国家的购买力和获得贷款的机会,为各国提出提高GDP的政策和项目提供动力。GDP“衡量一个国家在给定时间段内生产…...
【博客625】keepalived开启garp refresh的重要性
keepalived开启garp refresh的重要性 1、场景 1-1、对keepavlied master机器热迁移后出现vip不通,过后恢复 原因:机器迁移后网关那边的arp表没有刷新,流量还是转发到老的端口,但是机器已经迁移到别的端口了,于是网络…...
nginx防护规则,拦截非法字符,防止SQL注入、防XSS,nginx过滤url访问,屏蔽垃圾蜘蛛,WordPress安全代码篇
nginx防护规则,拦截非法字符,防止SQL注入、防XSS,nginx过滤url访问,屏蔽垃圾蜘蛛,WordPress安全代码篇 精心强化,小白一键复制 资源宝分享:www.httple.net 宝塔为例:/www/server/panel/vhost/nginx/你的网站域名.conf,复制代码点击保存 修改www.xx.net你自己域名incl…...
【计算机网络】网络层
文章目录网络层概述网络层提供的两种服务IPv4地址IPv4地址概述分类编址的IPv4地址划分子网的IPv4地址无分类编址的IPv4地址IPv4地址的应用规划IP数据报的发送和转发过程静态路由配置及其可能产生的路由环路问题路由选择路由选择协议概述路由信息协议RIP的基本工作原理开放最短路…...
Android Studio中文界面:从英文困扰到母语开发的完整解决方案
Android Studio中文界面:从英文困扰到母语开发的完整解决方案 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 你是否曾…...
Illustrator脚本革命:7个必备工具彻底改变你的设计工作流
Illustrator脚本革命:7个必备工具彻底改变你的设计工作流 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 你是否还在Adobe Illustrator中重复着枯燥的手工操作ÿ…...
物联网超低功耗设计:从睡眠优先到能量自治的十年续航之道
1. 项目概述:让物联网节点运行数十年的设计哲学如果你正在部署一个大规模的物联网网络,无论是智慧城市的数千个路灯传感器,还是遍布数公里农田的环境监测节点,最让你头疼的问题恐怕不是通信协议,也不是数据处理&#x…...
基于Azure AI Search与OpenAI构建企业级智能问答系统实战指南
1. 项目概述:当企业级搜索遇上生成式AI 如果你正在为如何让公司内部的知识库、产品文档或客服系统变得更“聪明”而头疼,那么你很可能已经听说过或将接触到这个项目: Azure-Samples/azure-search-openai-demo 。这不仅仅是一个简单的代码示…...
别再手动查字典了!用EggNOG-mapper 5.0一键搞定GO/KEGG/COG注释(附完整流程)
基因功能注释自动化:EggNOG-mapper 5.0实战指南 在基因组学研究中,功能注释是连接序列数据与生物学意义的关键桥梁。传统的手动注释流程往往需要研究人员在多数据库间反复切换,不仅耗时费力,还容易引入人为误差。而EggNOG-mapper…...
告别杂音:手把手教你用RNNoise为你的实时语音应用降噪(附Python/C++实战代码)
实时语音降噪实战:从RNNoise原理到多语言工程集成 在视频会议、在线教育、语音社交等场景中,背景噪声一直是影响语音质量的顽疾。传统降噪方案如谱减法、Wiener滤波在应对突发噪声时往往力不从心,而端到端的深度学习方案又面临实时性挑战。本…...
通过Taotoken用量看板清晰掌握团队API成本与模型使用偏好
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过Taotoken用量看板清晰掌握团队API成本与模型使用偏好 对于项目负责人或技术管理者而言,在引入大模型能力后&#x…...
终极KMS激活指南:如何永久免费激活Windows和Office系统
终极KMS激活指南:如何永久免费激活Windows和Office系统 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows激活弹窗而烦恼吗?是否遇到过Office突然变成只读模式…...
WebRTC、SIP通话背后的隐形功臣:手把手调试G711A/G711U的PCM音频数据
WebRTC与SIP通话背后的音频基石:G711编解码实战解析 实时音视频通信已经成为现代互联网的基础设施,从在线会议到客服电话,背后都离不开高效的音频编解码技术。在众多音频编码标准中,G711系列以其简单可靠的特性,依然活…...
Windows XP图标主题完整指南:轻松为Linux桌面注入经典怀旧风格
Windows XP图标主题完整指南:轻松为Linux桌面注入经典怀旧风格 【免费下载链接】Windows-XP Remake of classic YlmfOS theme with some mods for icons to scale right 项目地址: https://gitcode.com/gh_mirrors/win/Windows-XP 还在怀念Windows XP那个经典…...
