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服务器进行…

corpus  academic writing

http://micusp.elicorpora.info/ http://corpus.byu.edu/coca/ http://rcpce.engl.polyu.edu.hk/RACorpus/转载于:https://www.cnblogs.com/gisalameda/p/5590034.html

vim命令练习题。

练习题。1. vi 与 vim 有什么区别呢&#xff0c;它们之间有什么关系&#xff1f;答&#xff1a;vi 和vim最大的区别就是编辑一个文本时&#xff0c;vi不会显示颜色&#xff0c;而vim会显示颜色。显示颜色更易于用户进行编辑。vim的这些优势主要体现在以下几个方面&#xff1a;1…

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目录里。重…

ansible 批量部署ssh免密钥

1 创建ssh秘钥 yum install epel-release -y yum install sshpass -y ssh-keygen -t rsa 2 批量复制秘钥并授权 ansible web -m shell -a ‘mkdir ~/.ssh’ -k ansible web -m copy -a ‘src~/.ssh/id_rsa.pub dest~/.ssh/authorized_keys mode0600’ -k 3 测试 ssh 10.0.0.2…

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…

python如何避免转义字符_如何解决因转义字符而报错的问题(在使用python导入文件时)...

有些萌新在初次使用python导入文件时&#xff0c;可能会遇到遇到各种各样的报错。今天我们就来讲讲其中最常见的一种报错---转义字符“\”冲突。问题重述&#xff1a;比如像下面这样&#xff0c;当我们想导入一个常见的csv文件时&#xff0c;发现居然报了这样一个错误&#xff…

同意条款按钮可用

// 同意条款function isaccepted(){ if(document.getElementById("read").checkedtrue){ document.getElementById("submit").disabled false; $(#submit).css("background","#f25618"); }else{ document.getElementById("s…

Ansible执行过程分析、异步模式和速度优化

Ansible系列(七)&#xff1a;执行过程分析、异步模式和速度优化 分类: Linux服务篇 undefined 我写了更完善的Ansible专栏文章&#xff1a;一步到位玩儿透Ansible Ansible系列文章&#xff1a;http://www.cnblogs.com/f-ck-need-u/p/7576137.html 1.1 ansible执行过程分析 …

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(一般打印在终端上吧) 都是黑白的, 此时就要介绍另外一个概…

使用fping 查看局域网中有哪些ip

安装 fping arp-get install fping 使用方法 fping -g 自己ip地址/24 使用 nmap 也可以查看 但是速度慢些 nmap 功能比fping 功能强大 nmap -sP 自己ip地址/24

算法题:判断字符串是否为 ipv4 地址

#include <stdio.h>typedef char bool; #define true 1 #define false 0/**1.判断字符串是否形如“192.168.1.1”2.字符串两端含有空格视为合法ip&#xff0c;形如“ 192.168.1.1 ”3.字符串中间含有空格视为非法ip&#xff0c;形如“192.168. 1.2”4.字符串0开头视…

未捕获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;怎么没有白费啊…

win2008r2 AD用户账户的批量导入方法

win2008r2 AD用户账户的批量导入方法 http://www.jb51.net/article/38423.htm 转载于:https://www.cnblogs.com/cl1024cl/p/6205798.html

centos ping不通百度 ping不通外网

ping不通百度 ping不通外网 这个问题会导致yum源安装软件失败 原因是 /etc/sysconfig/network-scripts/ifcfg-ens33 文件没有配置好 注意检查配置项 1配置本机ip地址 IPADDR 2设置网关 GATEWAY 3子网掩码 NETMASK 4MAC地址 HWADDR 5DNS服务器 DNS1 文件内容实例 TY…

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

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