当前位置: 首页 > news >正文

数据结构与算法—队列

队列

队列介绍

有序列表,可以用数组或者链表实现。遵循先进先出原则。

数组实现队列

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
—————————————————————————

作为初学者,很多知识都没有掌握,见谅,如有错误请指出,以期进步,感谢!。后续有新的学习,继续补充上来。

相关文章:

数据结构与算法—队列

队列 队列介绍 有序列表&#xff0c;可以用数组或者链表实现。遵循先进先出原则。 数组实现队列 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&#xff1a;防删图不是存活的绝对因素&#xff0c;除了防删图&#xff0c;还有账号&#xff0c;ip&#xff0c;内容&#xff0c;吧的问题 2&#xff1a;一个图不是每个吧都可以发 3&#xff1a;一个贴不被删不仅仅看图片 4&#xff1a;有时候运气也很…...

iOS接入Google登录

1.在Google Cloud后台配置客户端ID 首先要在 Google Cloud 中创建一个项目。新创建的Project需要先配置同意屏幕。一共有4步骤需要配置。 1.OAuth 同意屏幕 User Type选择"外部"进行创建。填写必必要的信息&#xff0c;应用名称、用户支持电子邮件地址、开发者电子邮…...

【C语言】大小端字节序问题

一、大小端字节序问题 大小端是由CPU决定的&#xff0c;大小端可以理解为字节顺序&#xff0c;所以大小端全称叫大端字节序、小端字节序。其实大端、小端这两个词是从《格列佛游记》里出来的。《格列佛游记》有一段讲的是吃鸡蛋是从大的那头敲开还是小的那头敲开的问题&#xf…...

Linux | 网络通信 | 序列化和反序列化的讲解与实现

文章目录为什么要序列化&#xff1f;协议的实现服务端与客户端代码实现为什么要序列化&#xff1f; 由于默认对齐数的不同&#xff0c;不同的平台对相同数据进行内存对齐后&#xff0c;可能得到不同的数据。如果直接将这些数据进行网络传输&#xff0c;对方很可能无法正确的获…...

C#的委托原理刨析and事件原理刨析和两者的比较

什么是委托委托是一种引用类型&#xff0c;表示对具有特定参数列表和返回类型的方法的引用。 在实例化委托时&#xff0c;你可以将其实例与任何具有兼容参数和返回类型的方法进行绑定。 你可以通过委托实例调用方法。简单的理解&#xff0c;委托是方法的抽象类&#xff0c;它定…...

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登录逻辑登录过滤器、配置过滤器登出登陆校验流程 认证 登录&#xff1a; ​ ①自定义登录接口 ​ 调用ProviderManager的方法进行认证 如果认证通过生成token&#xff0c;根据userId把用…...

Socket套接字

概念 Socket套接字&#xff0c;是由系统提供用于网络通信的技术&#xff0c;是基于TCP/IP协议的网络通信的基本操作单元。基于Socket套接字的网络程序开发就是网络编程。 分类 Socket套接字主要针对传输层协议划分为如下三类&#xff1a; 流套接字&#xff1a;使用传输层TCP…...

mysql详解之innoDB

索引 Mysql由索引组织&#xff0c;所以索引是mysql多重要概念之一。 聚簇索引 InnoDB和MyISAm一样都是采用B树结构&#xff0c;但不同点在于InnoDB是聚簇索引&#xff08;或聚集索引&#xff09;&#xff0c;将数据行直接放在叶子节点后面。 这里可能存在一个误区&#xff1…...

电信运营商的新尝试:探索非通信领域的发展

近年来&#xff0c;随着电信运营商竞争的日趋激烈和网络建设的成本不断攀升&#xff0c;许多电信运营商已经开始缩减IT投资。然而&#xff0c;在如此情况下&#xff0c;电信运营商仍然需要寻找新的增长机会。那么&#xff0c;在持续缩减IT投资的情况下&#xff0c;电信运营商可…...

第07章_单行函数

第07章_单行函数 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 1. 函数的理解 1.1 什么是函数 函数在计算机语言的使用中贯穿始终&#xff0c;函数的作用是什么呢&#xff1f;它可以把我们经…...

Echarts实现多柱状图重叠重叠效果

有两种重叠效果: 1. 多个柱子重叠为一个 2. 多个柱子重叠为两组 第一种,图例: 这个灰色不是阴影哦, 是柱子. 1. 使用详解 (1) series.Z 折线图组件的所有图形的 z 值。控制图形的前后顺序。 z 值小的图形会被 z 值大的图形覆盖。z 相比 zlevel 优先级更低&#xff0c;而且不会…...

PHP学习笔记(一谦四益)

前言 上一篇文章 PHP学习笔记&#xff08;观隅反三&#xff09;分享了数组的知识&#xff0c;这篇文章接着分享和数组相关的算法。 算法效率 算法效率分为两种&#xff1a;第一种是时间效率&#xff0c;第二种是空间效率。时间效率被称为时间复杂度&#xff0c;而空间效率被称…...

Jvm -堆对象的划分

堆对于一个jvm进程来说是唯一的&#xff0c;一个进程只有一个jvm&#xff0c;但是进程半酣多个线程&#xff0c;多个线程共享一个堆。 也就是说&#xff0c;一个jvm实例只存在一个堆&#xff0c;同时对也是Java内存管理的核心区域。 Java堆区域的大小在jvm启动时就已经被确定…...

2023美赛F题讲解+数据领取

我们给大家准备了F题的数据&#xff0c;免费领取&#xff01;在文末 国内生产总值(GDP)可以说是一个国家经济健康状况最著名和最常用的指标之--。它通常用于确定一个国家的购买力和获得贷款的机会,为各国提出提高GDP的政策和项目提供动力。GDP“衡量一个国家在给定时间段内生产…...

【博客625】keepalived开启garp refresh的重要性

keepalived开启garp refresh的重要性 1、场景 1-1、对keepavlied master机器热迁移后出现vip不通&#xff0c;过后恢复 原因&#xff1a;机器迁移后网关那边的arp表没有刷新&#xff0c;流量还是转发到老的端口&#xff0c;但是机器已经迁移到别的端口了&#xff0c;于是网络…...

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的基本工作原理开放最短路…...

产品经理知识体系:1.什么是互联网思维?

互联网思维 思考 笔记 用户思维 是要注重用户体验&#xff0c;产品带给用户的价值是什么&#xff0c;是能帮助用户获取想要的商品、解决生活中的问题、获取想要的信息&#xff0c;还是产品能通过兜售参与感、满足感等来满足用户的心理需求。 贯穿产品的整个生命周期过程。 简…...

【数据结构】单链表的接口实现(附图解和源码)

单链表的接口实现&#xff08;附图解和源码&#xff09; 文章目录单链表的接口实现&#xff08;附图解和源码&#xff09;前言一、定义结构体二、接口实现&#xff08;附图解源码&#xff09;1.开辟新空间2.头插数据3.头删数据4.打印整个单链表5.尾删数据6.查找单链表中的数据7…...

TikTok话题量超30亿,这款承载美好记忆的剪贴簿引发讨论

回忆风剪贴簿在TikTok引起关注小超在浏览超店有数后台时发现&#xff0c;有一款平平无奇的剪贴簿的种草视频爆火&#xff0c;在24h内收获了9.9K点赞&#xff0c;播放量更是突破了100W&#xff0c;直接冲到了【种草视频飙升榜】第六名的位置&#xff0c;并且这个数字目前仍在继续…...

了解Dubbo

1.注册中心挂了&#xff0c;消费者还能不能调用生产者&#xff1f; 注册中心挂了&#xff0c; 消费者依然可以调用生产者。生产者和消费者都会在本地缓存注册中心的服务列表&#xff0c;当注册中心宕机时&#xff0c;消费者会读取本地的缓存数据&#xff0c;直接访问生产者&am…...

2023年前端面试知识点总结(JavaScript篇)

近期整理了一下高频的前端面试题&#xff0c;分享给大家一起来学习。如有问题&#xff0c;欢迎指正&#xff01; 1. JavaScript有哪些数据类型 总共有8种数据类型&#xff0c;分别是Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt Null 代表的含义是空对象…...

jQuery

文章目录jQuery 介绍初体验核心函数jQuery 对象和 dom 对象区分什么是 jQuery 对象&#xff0c;什么是 dom 对象问题&#xff1a;jQuery 对象的本质是什么&#xff1f;jQuery 对象和 Dom 对象使用区别Dom 对象和 jQuery 对象互转&#xff08;重点&#xff09;jQuery 选择器&…...

强化学习基础概念

强化学习入门 入门学习第一周&#xff1a;基础概念 经验回放&#xff1a; 将sss,agent当前步的action环与境的交互rrr以及下一步的状态st1s_{t1}st1​组成的四元组[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wxhVd0dn-1676710992983)(null)] 组…...

Redis学习【9】之Redis RDB持久化

文章目录一 AOF(Append Only File) 持久化二 AOF 基础配置2.1 AOF的开启2.2 文件名配置2.3 混合式持久化开启2.4 AOF 文件目录配置三 AOF 文件格式3.1 Redis 协议3.2 查看 AOF 文件3.3 清单文件3.4 Rewrite 机制3.4.1 rewrite简介3.4.2 rewrite 计算策略3.4.3 手动开启 rewrite…...

分析 vant4 源码,学会用 vue3 + ts 开发毫秒级渲染的倒计时组件,真是妙啊

2022年11月23日首发于掘金&#xff0c;现在同步到公众号。11. 前言大家好&#xff0c;我是若川。推荐点右上方蓝字若川视野把我的公众号设为星标。我倾力持续组织了一年多源码共读&#xff0c;感兴趣的可以加我微信 lxchuan12 参与。另外&#xff0c;想学源码&#xff0c;极力推…...

事件驱动型架构

事件驱动型架构是一种软件设计模式&#xff0c;其中微服务会对状态变化&#xff08;称为“事件”&#xff09;作出反应。事件可以携带状态&#xff08;例如商品价格或收货地址&#xff09;&#xff0c;或者事件也可以是标识符&#xff08;例如&#xff0c;订单送达或发货通知&a…...

黄色的html代码/seo下拉优化

1.下载安装qrcodejs2包 npm i qrcodejs2 2.导入 import QRCode from "qrcodejs2"; 3.html <div class"qrcode" id"qrcode"></div> //class是我的样式可以忽略&#xff0c;但是id一定要下 4.使用&#xff0c;以下是我的代码&…...

爱站网是干嘛的/短视频培训要多少学费

摘抄整合&#xff0c;勿喷 GDB r&#xff1a;run&#xff0c;执行程序 n&#xff1a;next&#xff0c;下一步&#xff0c;不进入函数 s&#xff1a;step&#xff0c;下一步&#xff0c;会进入函数 b&#xff1a;breakponit&#xff0c;设置断点 l&#xff1a;list&#xff…...

做网站好的框架/国外seo网站

前不久为了部署Django项目&#xff0c;在百度上到处找教程&#xff0c;找到的教程因为这样那样的原因&#xff0c;总是失败&#xff0c;可能是因为作者水平比较高吧&#xff0c;有些细节的东西估计没写出来&#xff0c;造成我这种初学者想照着做都做不成。百度不行就用Google吧…...

网站被取消备案/微博推广平台

原标题&#xff1a;实现一个简单的模板引擎模板引擎&#xff0c;其实就是一个根据模板和数据输出结果的一个工具。我们要开发一个将模板文件转换成我们实际要使用的内容的工具&#xff0c;这个工具就是模板引擎。我们把模板文件里的内容当成字符串传入到模板引擎中&#xff0c;…...

现在做网站用的软件/关键词排名点击软件首页

博客地址&#xff1a;http://www.moonxy.com 一、前言 Elasticsearch 底层依赖于 Lucene 库&#xff0c;而 Lucene 库完全是 Java 编写的&#xff0c;前面的文章都是发送的 RESTful API 请求&#xff0c;其实这些请求最后还是通过 Java 执行的。RESTful API 能做的 Java API 都…...

大兴黄村网站建设公司/网站seo排名优化方法

下面&#xff0c;根据上面范例提供的内容&#xff0c;举几个例子&#xff1a;例1 RAM READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;上面这句话的意思是&#xff1a;分配0x2000-0x3FFF的区域的块名为“RAM”&#xff08;当然可以定义别的名称&#xff09;&#xff0c;由上一…...