Java数据结构-栈、队列常用类(Stack、ArrayDeque、LinkedLList)

news2024/9/24 5:24:42

数据结构的三要素包括:逻辑结构、存储结构、数据的运算。逻辑结构描述的是数据之间的逻辑关系,分为线性结构(线性表(数组、链表)、栈、队列)和非线性结构(图、树、集合)。物理结构也称为存储结构(顺序存储、链式存储、索引存储、散列存储)。

常见的数据结构分为线性数据结构和非线性数据结构,包括:数组、链表、栈、队列、树、图、散列表等。

 在Java中,数组这种数据结构有专门的实现:不可变数组(int [] array={})、可变数组(ArrayList),同样的链表这种数据结构也有专门的实现类(LinkedList),这些实现类都是java封装好的类,开箱即用。但是,java有没有专门针对于栈、队列这两种数据结构的封装类呢?

结果是肯定的。下面我们来介绍在java这门语言中,对栈、队列这两种数据结构的封装类。

一、栈(Stack、ArrayDeque、LinkedList)

首先来看一下JAVA集合体系图

 

Stack类,正如类名那样,该类是java对栈这种数据结构的封装,我们可以很容易滴使用该类中的方法实现栈的所有功能。下面是该类的五个方法

方法名返回类型说明
emptyboolean判断是否为空
peekE只返回栈顶端的元素,不弹出该元素(空栈会抛出异常)
popE弹出栈顶的元素
pushE将元素压入栈,并返回
searchint返回最靠近顶端的目标元素到顶端的距离(调用 lastIndexOf)

不过,由于Stack类是继承至Vector,Vector 类在方法上添加了 synchronized ,以达到线程安全的目的,不过 JVM 级别的 synchronized 特别消耗资源,已不被 Java 官方推荐使用。因此,用Stack类作为栈来使用已经不合时宜。

 ArrayDeque类实现了Deque接口,而Deque接口又继承至Queue接口,Queue是一个单向队列,在头部进行remove()、poll()出队操作,在尾部进行add()、offer()入队操作,使用peek()、element()方法检索队列头。下面的表格给出了Queue接口的方法,

boolean

add(E e) 

将指定的元素插入到此队列中,如果可以立即执行此操作,而不会违反容量限制, true在成功后返回 IllegalStateException如果当前没有可用空间,则抛出IllegalStateException。

E

element() 

检索,但不删除,这个队列的头。

boolean

offer(E e) 

如果在不违反容量限制的情况下立即执行,则将指定的元素插入到此队列中。

E

peek() 

检索但不删除此队列的头,如果此队列为空,则返回 null 。

E

poll() 

检索并删除此队列的头,如果此队列为空,则返回 null 。

E

remove() 

检索并删除此队列的头。

 Deque接口定义了双端队列,deque(double-ended queue,双端队列)是一种具有队列和栈的性质的数据结构,它允许两端都可以进行入和出队操作的队列,即元素可以从队头出队和入队,也可以从队尾出队和入队。因此。Deque即可当成队列使用,也可当成栈使用。下面是Deque中定义的方法:

boolean

add(E e) 

将指定的元素插入此双端队列表示的队列中(换句话说,在此双端队列的尾部),如果它是立即可行且不会违反容量限制,返回 true在成功时和抛出 IllegalStateException如果当前没有空间可用的。

void

addFirst(E e) 

插入此双端队列的前面,如果它是立即可行且不会违反容量限制,抛出一个指定的元素 IllegalStateException如果当前没有空间可用。

void

addLast(E e) 

在插入如果它是立即可行且不会违反容量限制,抛出此双端队列的末尾指定元素 IllegalStateException如果当前没有空间可用。

boolean

contains(Object o) 

如果此deque包含指定的元素,则返回 true 。

Iterator<E>

descendingIterator() 

以相反的顺序返回此deque中的元素的迭代器。

E

element() 

检索但不删除由此deque表示的队列的头部(换句话说,该deque的第一个元素)。

E

getFirst() 

检索,但不删除,这个deque的第一个元素。

E

getLast() 

检索,但不删除,这个deque的最后一个元素。

Iterator<E>

iterator() 

以正确的顺序返回此deque中的元素的迭代器。

boolean

offer(E e) 

将指定的元素插入由此deque表示的队列(换句话说,在该deque的尾部),如果可以立即执行,而不违反容量限制, true在成功时 false如果当前没有可用空间,则返回false。

boolean

offerFirst(E e) 

在此deque的前面插入指定的元素,除非它会违反容量限制。

boolean

offerLast(E e) 

在此deque的末尾插入指定的元素,除非它会违反容量限制。

E

peek() 

检索但不删除由此deque表示的队列的头部(换句话说,此deque的第一个元素),如果此deque为空,则返回 null 。

E

peekFirst() 

检索,但不删除,此deque的第一个元素,或返回 null如果这个deque是空的。

E

peekLast() 

检索但不删除此deque的最后一个元素,如果此deque为空,则返回 null 。

E

poll() 

检索并删除由此deque(换句话说,此deque的第一个元素)表示的队列的 null如果此deque为空,则返回 null 。

E

pollFirst() 

检索并删除此deque的第一个元素,如果此deque为空,则返回 null 。

E

pollLast() 

检索并删除此deque的最后一个元素,如果此deque为空,则返回 null 。

E

pop() 

从这个deque表示的堆栈中弹出一个元素。

void

push(E e) 

将元素推送到由此deque表示的堆栈(换句话说,在此deque的头部),如果可以立即执行此操作而不违反容量限制,则抛出 IllegalStateException如果当前没有可用空间)。

E

remove() 

检索并删除由此deque表示的队列的头(换句话说,该deque的第一个元素)。

boolean

remove(Object o) 

从此deque中删除指定元素的第一个出现。

E

removeFirst() 

检索并删除此deque的第一个元素。

boolean

removeFirstOccurrence(Object o) 

从此deque中删除指定元素的第一个出现。

E

removeLast() 

检索并删除此deque的最后一个元素。

boolean

removeLastOccurrence(Object o) 

从此deque中删除指定元素的最后一次出现。

int

size() 

返回此deque中的元素数。

ArrayDeque类实现了Deque接口 ,类内方法基本与Deque一致。不过ArrayDeque类的底层是一个环形数组,具体来说在逻辑结构上是一个环形,但是实际存储结构上是一个一维数组。

在这里插入图片描述

下面是该类的常用方法 

boolean

add(E e) 

在此deque的末尾插入指定的元素。

void

addFirst(E e) 

在此deque前面插入指定的元素。

void

addLast(E e) 

在此deque的末尾插入指定的元素。

void

clear() 

从这个deque中删除所有的元素。

ArrayDeque<E>

clone() 

返回此deque的副本。

boolean

contains(Object o) 

如果此deque包含指定的元素,则返回 true 。

Iterator<E>

descendingIterator() 

以相反的顺序返回此deque中的元素的迭代器。

E

element() 

检索,但不删除,由这个deque表示的队列的头。

E

getFirst() 

检索,但不删除,这个deque的第一个元素。

E

getLast() 

检索,但不删除,这个deque的最后一个元素。

boolean

isEmpty() 

如果此deque不包含元素,则返回 true 。

Iterator<E>

iterator() 

返回此deque中的元素的迭代器。

boolean

offer(E e) 

在此deque的末尾插入指定的元素。

boolean

offerFirst(E e) 

在此deque前面插入指定的元素。

boolean

offerLast(E e) 

在此deque的末尾插入指定的元素。

E

peek() 

检索但不删除由此deque表示的队列的头部,如果此deque为空,则返回 null 。

E

peekFirst() 

检索但不删除此deque的第一个元素,如果此deque为空,则返回 null 。

E

peekLast() 

检索但不删除此deque的最后一个元素,或返回 null如果此deque为空)。

E

poll() 

检索并删除由此deque(换句话说,该deque的第一个元素)表示的队列的 null如果此deque为空,则返回 null 。

E

pollFirst() 

检索并删除此deque的第一个元素,如果此deque为空,则返回 null 。

E

pollLast() 

检索并删除此deque的最后一个元素,如果此deque为空,则返回 null 。

E

pop() 

从这个deque表示的堆栈中弹出一个元素。

void

push(E e) 

将元素推送到由此deque表示的堆栈上。

E

remove() 

检索并删除由此deque表示的队列的头部。

boolean

remove(Object o) 

从此deque中删除指定元素的单个实例。

E

removeFirst() 

检索并删除此deque的第一个元素。

boolean

removeFirstOccurrence(Object o) 

删除此deque中指定元素的第一个出现(从头到尾遍历deque时)。

E

removeLast() 

检索并删除此deque的最后一个元素。

boolean

removeLastOccurrence(Object o) 

删除此deque中指定元素的最后一次(从头到尾遍历deque时)。

int

size() 

返回此deque中的元素数。

Spliterator<E>

spliterator() 

创建一个late-binding失败快速 Spliterator在这个deque的元素。

Object[]

toArray() 

以适当的顺序返回一个包含此deque中所有元素的数组(从第一个到最后一个元素)。

<T> T[]

toArray(T[] a) 

以正确的顺序返回一个包含此deque中所有元素的数组(从第一个到最后一个元素); 返回的数组的运行时类型是指定数组的运行时类型。

 LinkedList的底层维护了一个双向链表,它同时实现了List接口和Deque对口,因此它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(stack),换句话说,它同时具备双向链表和双端队列特点。从继承图上来看,该类实现了Deque接口,因此可以使用接口中的方法。

boolean

add(E e) 

将指定的元素追加到此列表的末尾。

void

add(int index, E element) 

在此列表中的指定位置插入指定的元素。

boolean

addAll(Collection<? extends E> c) 

按照指定集合的迭代器返回的顺序将指定集合中的所有元素追加到此列表的末尾。

boolean

addAll(int index, Collection<? extends E> c) 

将指定集合中的所有元素插入到此列表中,从指定的位置开始。

void

addFirst(E e) 

在该列表开头插入指定的元素。

void

addLast(E e) 

将指定的元素追加到此列表的末尾。

void

clear() 

从列表中删除所有元素。

Object

clone() 

返回此 LinkedList的浅版本。

boolean

contains(Object o) 

如果此列表包含指定的元素,则返回 true 。

Iterator<E>

descendingIterator() 

以相反的顺序返回此deque中的元素的迭代器。

E

element() 

检索但不删除此列表的头(第一个元素)。

E

get(int index) 

返回此列表中指定位置的元素。

E

getFirst() 

返回此列表中的第一个元素。

E

getLast() 

返回此列表中的最后一个元素。

int

indexOf(Object o) 

返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。

int

lastIndexOf(Object o) 

返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。

ListIterator<E>

listIterator(int index) 

从列表中的指定位置开始,返回此列表中元素的列表迭代器(按适当的顺序)。

boolean

offer(E e) 

将指定的元素添加为此列表的尾部(最后一个元素)。

boolean

offerFirst(E e) 

在此列表的前面插入指定的元素。

boolean

offerLast(E e) 

在该列表的末尾插入指定的元素。

E

peek() 

检索但不删除此列表的头(第一个元素)。

E

peekFirst() 

检索但不删除此列表的第一个元素,如果此列表为空,则返回 null 。

E

peekLast() 

检索但不删除此列表的最后一个元素,如果此列表为空,则返回 null 。

E

poll() 

检索并删除此列表的头(第一个元素)。

E

pollFirst() 

检索并删除此列表的第一个元素,如果此列表为空,则返回 null 。

E

pollLast() 

检索并删除此列表的最后一个元素,如果此列表为空,则返回 null 。

E

pop() 

从此列表表示的堆栈中弹出一个元素。

void

push(E e) 

将元素推送到由此列表表示的堆栈上。

E

remove() 

检索并删除此列表的头(第一个元素)。

E

remove(int index) 

删除该列表中指定位置的元素。

boolean

remove(Object o) 

从列表中删除指定元素的第一个出现(如果存在)。

E

removeFirst() 

从此列表中删除并返回第一个元素。

boolean

removeFirstOccurrence(Object o) 

删除此列表中指定元素的第一个出现(从头到尾遍历列表时)。

E

removeLast() 

从此列表中删除并返回最后一个元素。

boolean

removeLastOccurrence(Object o) 

删除此列表中指定元素的最后一次出现(从头到尾遍历列表时)。

E

set(int index, E element) 

用指定的元素替换此列表中指定位置的元素。

int

size() 

返回此列表中的元素数。

Spliterator<E>

spliterator() 

在此列表中的元素上创建late-binding故障快速 Spliterator 。

Object[]

toArray() 

以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组。

<T> T[]

toArray(T[] a) 

以正确的顺序返回一个包含此列表中所有元素的数组(从第一个到最后一个元素); 返回的数组的运行时类型是指定数组的运行时类型。

由于LinkedList与ArrayDeque都是实现了Deque接口,因此这两个类中定义的方法几乎完全相同,因此这两个类的用法也几乎没有什么差异,虽然对于使用者而言,用这两个类都可以轻而易举的实现栈、队列的功能。

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

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

相关文章

服务器是干什么用的?

首先&#xff0c;什么是服务器&#xff1f;服务器是提供计算服务器和网络服务的设备。服务器和计算机由CPU、硬盘、内存、系统总线等组成。比如我们访问一个网站&#xff0c;点击这个网站会发出访问请求&#xff0c;服务器会响应服务请求&#xff0c;进行相应的处理&#xff0c…

在windows中使用tomcat搭建Jenkins

1、 准备环境&#xff1a;JDK JDK官网下载&#xff1a;https://download.oracle.com/java/19/latest/jdk-19_windows-x64_bin.msi 2、 tomcat包 tocat官网下载&#xff1a;https://tomcat.apache.org/download-90.cgi 3、 Jenkins.war包 Jenkins官网下载&#xff1a;https://mi…

GEE学习笔记 七十六:【GEE之Python版教程十】字典

python中万物皆对象&#xff0c;字典在其他的语言中也有称之为对象&#xff0c;无论怎么称呼它其实就是 {key:value} 这种格式。 依然是运行代码前先注册GEE import ee ee.Initialize() 1、字典的API 首先看一下GEE的python版API&#xff08;Welcome to GEE-Python-API’s d…

曾经的月薪3K,现在的月薪25K,我的测试经验值得你的借鉴

成功不能复制&#xff0c;但经验却可以借鉴&#xff01;从曾经的月薪3K&#xff0c;到现在的月薪25K&#xff0c;我觉得我的涨薪之路的的确确可以给很多人一些参考。授人以鱼不如授人以渔&#xff0c;所以&#xff0c;今天我也想把我的经验分享给大家&#xff0c;希望可以帮助一…

Unity New Input System

安装 Input System是新的输入系统&#xff0c;用来取代旧的Input Manager&#xff0c;方便接收不同的输入设备 在Package Manager里安装 安装后可以选择只使用新的Input System&#xff0c;或选Both两者都使用&#xff0c;考虑很多插件还在使用旧的Input Manager&#xff0c…

nacos discovery和config

微服务和nacos版本都在2.x及之后。1、discovery用于服务注册&#xff0c;将想要注册的服务注册到nacos中&#xff0c;被naocs发现。pom引入的依赖是&#xff1a;yml配置文件中&#xff1a;2、config用于获取nacos配置管理->配置列表下配置文件中的内容pom引入的依赖是&#…

Android问题解决方案(一):Android 打空包后提示没有”android:exported“的属性设置

Android 打空包后提示没有”android:exported“的属性设置Android 打空包后提示没有”android:exported“的属性设置1、问题&#xff1a;2、文档3、参考链接&#xff1a;4、解决方案&#xff1a;Android 打空包后提示没有”android:exported“的属性设置 1、问题&#xff1a; …

SpringMVC——基础知识

基本概念 SpringMVC是基于servlet api构造的原始web框架&#xff0c;全称是Spring Web MVC 而MVC的全称是Model View Controller&#xff0c;翻译成中文分别是“模型”&#xff0c;“视图”&#xff0c;“控制器”&#xff0c;这是一种软件的架构模式 Model&#xff1a;用来…

JavaScript:简单理解防抖和节流,如何定义防抖和节流函数?

防抖 防抖函数&#xff0c;就是防止抖动&#xff0c;避免事件重复触发。比如监听输入框的输入&#xff0c;不应该在用户每输入一个字符就触发监听&#xff0c;而是在用户输入结束后再来监听。 流程为&#xff1a; 1、事件触发&#xff1b; 2、开启定时器&#xff1b; 3、当事…

致远OAA6版安装

准备工作&#xff0c;操作系统winserver2019&#xff0c;sqlserver2019。致远OA安装包0.SeeyonInstall.zip相关下载&#xff1a;winserver2019下载地址&#xff1a;cn_windows_server_2019_updated_july_2020_x64_dvd_2c9b67da.iso magnet:?xturn:btih:22A410DEA1B0886354A34D…

实用版ChatBing论文阅读助手教程+新测评

实用版ChatBing论文阅读助手新测评 AI进化&#xff08;更新&#xff09;的速度太快了&#xff01;距离我上次的【Chat嘴硬&#xff01;基于NewBing的论文调研评测报告】&#xff0c;才四天&#xff0c;它已经进化到快能用的地步了&#xff01; 这次是我刷B站看到热门推荐&…

美团 PK 抖音,内容与商业化之间的较量谁能赢?

□ 最近事件&#xff1a;根据Tech星球报道&#xff0c;近期美团升级短视频、直播等内容建设&#xff1b;并且宣称调整战略&#xff0c;发力短视频和直播 1、美团外卖APP商家信息流中&#xff0c;会出现约30秒的短视频内容&#xff0c;视频偏向于种草&#xff0c;主要是向消费者…

明美新能在创业板IPO过会:计划募资4.5亿元,2022年营收约39亿元

2月17日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;广州明美新能源股份有限公司&#xff08;下称“明美新能”&#xff09;获得上市委会议审议通过。本次冲刺上市&#xff0c;明美新能计划募资4.50亿元&#xff0c;德邦证券为其保荐机构。 据介绍&#xff0c;明美新…

响应式编程(Reactive Programming)介绍

什么是响应式编程? 在互联网上有着一大堆糟糕的解释与定义。Wikipedia 一如既往的空泛与理论化。Stackoverflow 的权威答案明显不适合初学者。Reactive Manifesto 看起来是你展示给你公司的项目经理或者老板们看的东西。微软的 Rx terminology"Rx Observables LINQ S…

WebGPU学习(1)---在WebGPU上绘制三角形

在本文中&#xff0c;我们将使用 WebGPU 绘制一个简单的三角形。示例地址 初始化 WebGPU WebGPU 初始化的流程比 WebGL 要更复杂。 在 WebGL 中&#xff0c;我们只需从 Canvas 元素获取 WebGL 渲染上下文&#xff0c;如 getContext(“webgl” 或者 “webgl2”)。 const gl …

浙江工业大学关于2023年MBA考试初试成绩查询及复试阶段说明

根据往年的情况&#xff0c;2023浙江工业大学MBA考试初试成绩可能将于2月21日公布&#xff0c;为了广大考生可以及时查询到自己的分数&#xff0c;杭州达立易考教育为大家汇总了信息。 1、初试成绩查询&#xff1a;考生可登录中国研究生招生信息网“全国硕士研究生招生考…

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…

极客时间左耳听风-高效学习

左耳听风——高效学习篇 P95 | 高效学习&#xff1a;端正学习态度 本人真实⬇️⬇️⬇️⬇️ “ 大部分人都认为自己爱学习&#xff0c;但是&#xff1a; 他们都是只有意识没有行动&#xff0c;他们是动力不足的人。 他们都不知道自己该学什么&#xff0c;他们缺乏方向和目标。…

基于RK3588的嵌入式linux系统开发(四)——uboot镜像下载(基于RKDevTool工具)

官方提供的SDK中包含RKDevTool工具&#xff08;RKDevTool_Release_v2.92&#xff09;和相应的驱动&#xff08;DriverAssitant_v5.1.1&#xff09;。本节主要介绍在windows操作系统环境下利用RKDevTool下载以上生成的uboot镜像和bootloader镜像。注意&#xff1a;本节使用的板卡…

什么是Type-c口?Type-c口有什么优势?

什么是Type-C接口 Type-C接口有哪些好处坏处 说起“Type-C”&#xff0c;相信大家都不会陌生&#xff0c;因为最近拿它大做文章的厂商着实不少&#xff0c;但要具体说清楚Type-C是什么&#xff0c;估计不少人只能说出“可以正反插”“USB的一种”之类的大概。其实&#xff0c;T…