Java数据结构--队列(基于链表+数组)

一:队列的定义(先进先出)

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

144992962807450e88fd3269d9dc1bff.jpg

二:Java API中Queue类的方法摘要

我们在实现队列的代码之前,先来了解一下Java API中Queue类的方法摘要,要知道它是如何创建使用的。

①如何创建Queue对象

首先我们要知道,在Java中队列Queue是一个接口,实现一个接口的话我们要重写其中所有的方法。那么这样我们在使用队列的时候就会比较麻烦了。

82b1fff0a7db47aba1c022854d92362b.png

我们来看一下Java API中的LinkedList类

2a9b37624ae643b8899e764cefaf7ca9.jpg

在图中我们可以看到LinkedList类实现了Queue类的接口,因此我们可以把LinkedList类当做Queue类来使用,这样我们就可以new LinkedList类来使用队列

②队列的几种常用方法(入队出队)运用

下面我们来看一下Queue类中的方法摘要,并来运行一下其中最常用的几种方法(入队出队),以便于我们初学者更好的了解并使用队列

2634c0c50ccb42ddb7ccc7bea790e877.png

5543472fbead49498bf0a563af76bfbe.jpg

405169054bc045de9fb42c28f9512a32.jpg 

三:队列的代码实现(要先了解泛型)

知道了队列是如何创建并使用的,下面我们就基于数组和链表来依次实现队列

1.基于数组的实现

Ⅰ.方法一:动态数组

思路:定义两个指针front和tail,入队在tail位置,更新tail指针,出队在front位置,更新front位置,若数组满了,再去扩展数组长度

如图所示:

5fbea6641f3941f5bd611162a70a4488.jpg

Ⅱ.方法二:循环数组(仅限于数据不是很大)

上述单项数组的实现,出队的话front向前移,那么数组中front前面的空间是不是就用不到了。像栈一样,即使队列中有许多操作的情况下,队列也不是很大。那么我们就可以用一个循环数组来优化一下

只要front或者tail到达数组对尾,它就绕回开头

据图我们来了解一下

0532aa0fa52e43748d77e61dbc04a6e0.png

①入队 offer

②出队 poll

③获取对尾元素但不做出队 peek

④是否为空 isEmpty

0c5f65c18d454397a4c9c1927924b39f.png

2.基于链表的实现

队列的链式存储结构简称为链式队列。它实际上是一个限制仅在表头删除和表尾插入的单链表。

1c4edb8c27dd448eb565463336a165ef.jpg

基于链表,首先我们先要创建一个节点对象

f5414df0f73c4c998a245da1e38e28ff.jpg

①入队 offer

思路:表尾插入,更新tail指针

cb463f51223f4dcdadfac182e0507b8a.jpg

②出队 poll

思路:表头删除,更新front指针,值得注意的是:如果队列为空,则返回null

a4c12ec39833410f809861d50440cad7.jpg 

③获取对尾元素但不出队 peek

④是否为空

下面我们来剧此实现一下

b46930f489be47af931439d3914cdf52.png

 3.结果显示

①基于循环数组的实现

ead70ea76fc949d08c30c46c18e0d834.jpg c6984ad2677c4081b9467f19acd1fe5d.jpg

 ②基于链表的实现

2f5c988ad6434f078c3754b18c986d5a.jpg

 56edfb93426a469aba51452f6f17930b.jpg

各位的都实现了吗?

4.其他的队列

除了上述的队列,队列还存在双端队列,优先级队列以及阻塞队列等等,这都需要我们能够熟悉掌握并且熟练应用。

  • 栈和队列的应用以及其他队列的实现,我会在发布链表的实现之后再去发布,因为熟悉了链表之后,我们才可以更好的理解其他队列的实现。

如有错误,不足之处,望各位指出更正₍˄·͈༝·͈˄*₎◞ ̑̑

 

 

 

 

 

 

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汤姆大聪明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值