java 数据结构_Java版-数据结构-队列(数组队列)

81d7f287bb0581c2f59d0fcb49e571d4.png

前言

看过笔者前两篇介绍的 Java版数据结构 数组的盆友,都给予了笔者一致的好评,在这里笔者感谢大家的认可!!!

由于本章介绍的数据结构是 队列,在队列的实现上会基于前面写的 动态数组来实现,而 队列又和 不论是从特点上和操作上都有类似之处,所以在这里对这两种数据结构不了解的朋友,可以去看一下笔者前两篇文章介绍的数据结构 数组,这里笔者把链接贴出来(看过的盆友可以跳过此步骤...)

  • Java版-数据结构-数组
  • Java版-数据结构-栈

介绍

队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

队列的操作方式和 类似,唯一的区别在于队列只允许新数据在后端(rear)进行添加。

特点

  • 队列是一种线性结构
  • 只能从一端(队尾)添加元素,从另一端(队首)取出元素
  • 先进先出,First In First Out(FIFO)

之前在介绍栈的时候,通过示意图来帮助大家了解什么是栈;这里,我仍采用示意图形式向大家演示队列常用的两个操作: 入队操作出队操作

队列入队操作

67e1016e1b613f42b1acd0973fc7b0c7.png

这里我们可以形象地想成我们到银行办理业务排队的场景,现在A、B、C三个元素分别到银行柜台排成一条队办理业务(我们都是文明的孩纸,总不能插队O(∩_∩)O哈!),依次排队的元素是:A、B、C。

队列出队操作

acab83fa4d0075a2d970ae9511faa4fd.png

当元素 A办理完业务时,当前是元素 A先离开队列,然后是元素 B,最后是元素 C

我们时刻要牢记队列,入队是从 队尾一端进行入队,出队是从 队首一端进行出队,是一种:先进先出的数据结构。

本文会介绍队列的两张实现方式,一种是数组队列,另外一种是循环队列,考虑篇幅长度原因,本篇我们暂时只介绍数组队列,循环队列放在下一篇介绍。

数组队列(底层基于数组实现)

底层原理分析

现在我们声明一个数组的长度(capacity=3),元素个数为(size=0)的int类型数组的空队列,在这里,假设对队列的 队首为数组的 左侧队尾为数组的 右侧,示意图如下:

4f307ec213c880080fa909ea4e80a214.png

现在如果我们有四个元素:A、B、C、D要入队

元素 A入队

f19c8e4725a83f43ca224cb24b1970ff.png

元素 A已经入队了,现在开始元素 B入队

042ef5e7869ae950f68436aeb6226d74.png

元素 A和元素 B已经入队了,现在开始元素 C入队

3acc88803c5fb3fd8dae2371441ae026.png

元素 ABC已经分别入队了,现在如果我们要开始元素 D入队,根据我们之前定义的动态数组的特性,如果元素 D进行入队操作,会发现此时我们的数组已经满了,这时候数组会自动地 扩容(扩容的原理:新建一个容量是原数组容量两倍的数组,把原数组中的元素依次拷贝到新的数组中,最后引用指向新的数组)的原来的两倍(具体扩容多少,盆友可以自行设置)示意图如下:

d41a4f00eadb50056cab50b9cb21815c.png

到这里我们已经完成了元素:A、B、C、D的入队操作了,现在我们来看一下,它们的出队操作,根据队列的特性,队列是一种 先进先出的数据结构,之前入队操作顺序依次是: A->B->C->D,那么出队操作顺序仍然是: A->B->C->D

现在我们来看一下元素 A和元素 B出队后的示意图:

6cab7a693e27dc5ad9981c675b08abc9.png

元素 CD的出队原理和元素 A出队的原理一样,直至全部出队完成,变成空队列

在元素出队的过程中,相应地也会进行缩容操作,之前笔者这边定义,当数组中元素的个数(size)等于数组容量(capacity)的一半时,数组会进行缩容操作,这也正是动态数组的特点。

了解了数组队列的底层原理之后,接下来我们用代码来实现一下(建议盆友,在看之前,自己可以尝试写一下,然后在看,这样印象可能会比较深刻O(∩_∩)O哈!)

队列基本操作

  • 向队列中添加元素(入队)
void enqueue(E e);
  • 从队列中取出元素(出队)
E dequeue();
  • 获取队首元素
E getFront();
  • 获取队列中元素个数
int getSize(); 
  • 判断队列是否为空
boolean isEmpty();

代码实现

接口定义Queue

public interface Queue<E> {/*** 入队** @param e*/void enqueue(E e);/*** 出队** @return*/E dequeue();/*** 获取队首元素** @return*/E getFront();/*** 获取队列中元素的个数** @return*/int getSize();/*** 判断队列是否为空** @return*/boolean isEmpty();
}

DynamicArrayQueue 类实现接口 Queue

public class DynamicArrayQueue<E> implements Queue<E> {/*** 用数组存放队列中元素的个数*/private DynamicArray<E> dynamicArray;/*** 指定容量,初始化队列** @param capacity*/public DynamicArrayQueue(int capacity) {dynamicArray = new DynamicArray<>(capacity);}/*** 默认容量,初始化队列*/public DynamicArrayQueue() {dynamicArray = new DynamicArray<>();}@Overridepublic void enqueue(E e) {dynamicArray.addLast(e);}@Overridepublic E dequeue() {return dynamicArray.removeFirst();}@Overridepublic E getFront() {return dynamicArray.getFirst();}@Overridepublic int getSize() {return dynamicArray.getSize();}@Overridepublic boolean isEmpty() {return dynamicArray.isEmpty();}@Overridepublic String toString() {return "DynamicArrayQueue{" +"【队首】dynamicArray=" + dynamicArray + "}【队尾】";}
}

测试类: DynamicArrayQueueTest

public class DynamicArrayQueueTest {@Testpublic void testArrayQueue() {// 指定容量(capacity=6)初始化队列DynamicArrayQueue<String> dynamicArrayQueue = new DynamicArrayQueue(3);System.out.println("初始队列:" + dynamicArrayQueue);// 准备入队元素List<String> enQueueElements = Arrays.asList("A", "B", "C");// 元素入队enQueueElements.forEach(x -> dynamicArrayQueue.enqueue(x));System.out.println("元素A、B、C入队:" + dynamicArrayQueue);// 此时如果又有一个元素D入队,会发生扩容操作 (size == capacity)进行扩容dynamicArrayQueue.enqueue("D");System.out.println("元素D入队,发生扩容:" + dynamicArrayQueue);// 元素A出队,会发生缩容操作(size == capacity / 2)进行缩容dynamicArrayQueue.dequeue();System.out.println("元素A出队,发生缩容:" + dynamicArrayQueue);// 元素B出队dynamicArrayQueue.dequeue();System.out.println("元素B出队:" + dynamicArrayQueue);}
} 

运行结果

初始队列:DynamicArrayQueue{【队首】dynamicArray=DynamicArray{data=[null, null, null], size=0,capacity=3}}【队尾】元素A、B、C入队:DynamicArrayQueue{【队首】dynamicArray=DynamicArray{data=[A, B, C], size=3,capacity=3}}【队尾】元素D入队,发生扩容:DynamicArrayQueue{【队首】dynamicArray=DynamicArray{data=[A, B, C, D, null, null], size=4,capacity=6}}【队尾】元素A出队,发生缩容:DynamicArrayQueue{【队首】dynamicArray=DynamicArray{data=[B, C, D], size=3,capacity=3}}【队尾】元素B出队:DynamicArrayQueue{【队首】dynamicArray=DynamicArray{data=[C, D, null], size=2,capacity=3}}【队尾】
细心的盆友,会发现,因为队列的底层是数组来实现的,队列的出队操作实际上就是:删除数组中的第一个元素,后面的所有元素都要往前面挪一位;其实这样性能是比较低下的,时间复杂度是O(n)级别的。
我们想如果元素进行出队操作后,能否不挪动后面的元素,还能维持队列的特性,这样问题不就解决了吗?盆友可以自行思考一下。

完整版代码GitHub仓库地址:Java版数据结构-队列(数组队列) 欢迎大家【关注】和【Star

本篇完成的数组队列是基于之前【Java版-数据结构-数组】动态数组来实现的,下一篇笔者会给大家介绍用循环队列来解决数组队列带来的性能问题。接下来,笔者还会一一的实现其它常见的数组结构。

  • 静态数组
  • 动态数组
  • 数组队列
  • 循环队列
  • 链表
  • 循环链表
  • 二分搜索树
  • 优先队列
  • 线段树
  • 字典树
  • AVL
  • 红黑树
  • 哈希表
  • ....

持续更新中,欢迎大家关注公众号:小白程序之路(whiteontheroad),第一时间获取最新信息!!!

197156060a46c70809c422d3c0c95e33.png

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

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

相关文章

ssh 介绍 和使用 程序不挂起

目录 SSH的安全机制 SSH的安装 启动服务器的SSH服务 SSH两种级别的远程登录 SSH的高级应用 Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行…

java 四舍五入_Java常用类

每个人的心里&#xff0c;都藏着一个了不起的自己&#xff0c;只要你不颓废&#xff0c;不消极&#xff0c;一直悄悄酝酿着乐观&#xff0c;培养着豁达&#xff0c;坚持着善良&#xff0c;只要在路上&#xff0c;就没有到达不了的远方&#xff01;BigInteger在Java中&#xff0…

Sublime 插件- px 转rem

一个CSS的px值转rem值的Sublime Text 3自动完成插件。 插件效果如下&#xff1a; 安装 克隆项目 https://github.com/hyb628/cssrem.git进入packages目录&#xff1a;Sublime Text -> Preferences -> Browse Packages...复制下载的cssrem目录到刚才的packges目录里。重…

window8下安装RabbitMQ

2019独角兽企业重金招聘Python工程师标准>>> 1.下载并安装erlang&#xff0c;http://www.erlang.org/download.html。64位的下载的是otp_win64_19.1.exe 查看是否安装成功&#xff1a; 2.下载RabbitMQ,最新版是2.8.1&#xff0c;http://www.rabbitmq.com/releases/r…

gdb 收到SIGPIPE信号

2019独角兽企业重金招聘Python工程师标准>>> handle SIGPIPE noprint nostop 转载于:https://my.oschina.net/u/1176097/blog/761957

列的数目比列的名字要多_你们要的甘特图来啦!还有具体做法哦!

作为项目的负责人&#xff0c;“时间管理”也是极为重要的一环。甘特图作为常用的项目管理工具之一&#xff0c;有助于把一个大型项目划分为几个小部分&#xff0c;并有条理地展示。甘特图(Gantt chart)又称为横道图、条状图(Bar chart)。以提出者亨利劳伦斯甘特(Henry Laurenc…

图片处理拓展篇 : 图片转字符画(ascii)

首先要明确思路, 图片是由像素组成的, 不同的像素有不同的颜色(rgb), 那么既然我们要转化为字符画, 最直接的办法就是利用字符串来替代像素, 也就是用不同的字符串来代表不同的像素. 另外图片一般来讲是彩色的, 而acsii(一般打印在终端上吧) 都是黑白的, 此时就要介绍另外一个概…

未捕获typeerror: $形象。cropper不是函数_没有学不会的python--细说自定义函数的细节...

没有学不会的python函数是什么&#xff1f;老调常谈&#xff0c;还是那老一套&#xff0c;学习一个东西前&#xff0c;先搞懂是什么&#xff0c;再来学习怎么用。函数函数&#xff0c;如果你是刚经历过高考肯定很熟悉&#xff0c;数学中就经常出现这个名词&#xff0c;比如什么…

centos 7.0上RabbitMQ 3.5.6版本多实例启动操作讲解

在很多场景中&#xff0c;我们可能需要单机上启动多个rabbitmq实例&#xff0c;启动多个实例其实就是启用不同的端口。rabbitmq的默认端口为5672,15672,25672&#xff0c;以下经过实际操作绝对原创&#xff0c;亲测有效&#xff0c;耗费了老半天时间&#xff0c;怎么没有白费啊…

usg6000v 无法ping通_柯美复印机网络打印无响应?无法打印、扫描?原来这里出了问题...

机器在安装后&#xff0c;网络连接正常&#xff0c;使用ping命令可以通&#xff0c;但无法使用打印&#xff0c;扫描等网络功能Ping命令使用方法&#xff1a;1、“运行”输入CMD&#xff0c;调出Dos窗口2、输入命令&#xff1a;Ping 设备IP地址&#xff0c;按回车即可可以拼得通…

【NOIP考前模拟赛】纯数学方法推导——旅行者问题

一、写在前面 这题似乎是一道原创题目&#xff08;不是博主原创&#xff09;&#xff0c;所以并不能在任何OJ上评测&#xff0c;博主在网盘上上传了数据&#xff08;网盘地址&#xff1a;http://pan.baidu.com/s/1mibdMXi&#xff09;&#xff0c;诸位看官需者自取。另外博主使…

GO 语言笔记

使用 Visual Studio Code 开发环境配置请看 http://studygolang.com/articles/8851 为什么要使用Go 语言&#xff1f;Go 语言的优势在哪里&#xff1f; - Go 语言- 知乎 请看 https://www.zhihu.com/question/21409296 基础入门看官网 https://golang.org/ & 无闻 http…

qtreewidget 获取根节点_详解去中心化信任根dRoT技术

近日&#xff0c;第21届国际信息与通信安全会议(ICICS 2019)在北京召开。ICICS是国际公认的网络与信息安全类顶级学术会议&#xff0c;汇聚了国内外诸多信息安全专家与学术泰斗。本届ICICS 2019会议围绕信息与网络安全技术的各个方面展开深入研讨&#xff0c;议题涵盖了区块链、…

判断该网页是在什么设备打开。

为什么80%的码农都做不了架构师&#xff1f;>>> <script type"text/javascript"> //判断访问终端 var browser{versions:function(){var u navigator.userAgent, app navigator.appVersion;return {trident: u.indexOf(Trident) > -1, //IE内…

kail中tools的安装和第一个php学习笔记

安装tools 打开 鼠标右击选择 创建文件夹 mkdir cdrom 把tools文件复制到 位置——计算机——cdrom文件夹下 打开 cdrom cd cdrom 复制生成的目录 解压文件夹&#xff1a;tar zxvf 粘贴目录 回车 ls 复制目录 cd 粘贴目录 ls 复制后缀为pl的目录 ./粘贴目录.d自动下载 Enjoy代表…

PHP发送邮件

先看一下HTML如何发送邮件 HTML发送邮件首先得使用超链接标签<a> 之后使用mailto:链接收件人邮件地址 用bcc链接发件人邮箱&#xff08;加密抄送&#xff0c;cc为直接抄送&#xff09; mailto 和bcc/cc之间用?连接 subject邮件主题&#xff0c;body邮件内容&#xff0…

喇叭正反相位测试音频_FIR滤波器能给音频扩声带来怎样的帮助?

随着数字音频的快速发展&#xff0c;近些年在音频扩声领域&#xff0c;经常能听到音频技术人士讨论FIR数字滤波器&#xff0c;有些说法和厂家的宣传难免有些过于神化&#xff0c;有些厂家的技术工程师竟然宣称&#xff0c;自己的FIR滤波器能把每只扬声器或者整组扩声系统的相位…

使用c语言easy—x库实现实时钟表

先了解一下easy-x库 EasyX 是针对 C 的图形库&#xff0c;可以帮助 C语言初学者快速上手图形和游戏编程。 可以通过官网下载&#xff0c;文件很小&#xff0c; easy-x的支持头文件是 #include<graphics.h>下载之后双击打开会有所有easy-x函数的语法和作用&#xff0c;中…

java基础—方法重载(overload)

一、方法的重载 方法名一样&#xff0c;但参数不一样&#xff0c;这就是重载(overload)。 所谓的参数不一样&#xff0c;主要有两点&#xff1a;第一是参数的个数不一样&#xff0c;第二是参数的类型不一样。只要这两方面有其中的一方面不一样就可以构成方法的重载了。 1 packa…

word 编辑域中的汉字_word中插入的cad对象无法双击编辑问题解决记录

昨日&#xff0c;安装了天正插件5.0后&#xff0c;插入word中的cad图无法编辑了&#xff0c;弹出提示的大意是检查是否安装了cad或者是否关闭了CAD中所有的弹窗。在此之前&#xff0c;计算机装了office2010和cad2014及cad2018&#xff0c;office自动关联cad2018&#xff0c;即使…