数据结构与算法(Java版) | 教你如何使用环形数组来模拟队列

上一讲,我们就已经分析过了,使用数组来模拟队列的这种实现方式隐藏着一个很大的问题,即数组使用过一次之后便不能再使用了,也就是说压根就没有达到复用的效果。因此,要想解决这个隐患问题,那我们就得想办法让数组复用起来才行,也就是说如果我们从这个数组里面取出一个东东之后,那么空出的这个空间还得能被我们再次利用。

那怎么才能让数组复用起来呢?很简单,只须将其改进成环形数组即可,也就是说现在我们可就要用环形数组来模拟队列了,废话不多说,接下来就让我们来看看使用环形数组来模拟队列的一个思路分析吧!

什么是环形数组?

现在我们是要使用环形数组来模拟队列,那到底什么是环形数组呢?看下图,能一眼就看出环形数组其实就是一个大小固定、首尾相连的数组吧!

在这里插入图片描述

要不怎么说它是一个环形数组呢?你看,以上环形数组共有0、1、2、3、4五个索引,其中,索引4这个位置是不是就毗邻着索引0这个位置啊!那这可不就构成一个环形数组了嘛!当然,在物理上它还是一个普通的线性结构,只不过我们可以通过程序控制让其像一个环而已,环嘛,不就是其索引4结束之后下一个索引又变成0了嘛,对不对,首尾相连嘛!

使用环形数组来实现队列的好处

咱们先来看一下使用普通数组来实现队列是怎样一个情况,以此作为对比,我们也就不难得出使用环形数组来实现队列的好处了。

使用普通数组来实现队列,涉及到队列的两个常见操作是不是就是下面这两个啊!

  1. 向队列的尾部添加一个元素,即入队操作;
  2. 从队列的头部移除一个元素,即出队操作。

是个人都知道上面队列的两个常见操作吧!既然大家都知道了,那下面咱们就来分析分析一下这俩操作的效率如何吧!

假设此时我们使用普通数组来实现了一个队列,如下图所示。

在这里插入图片描述

不难想见,如果此时我们向队列的尾部新增一个元素,比如e,那么是不是就得像下面这样在数组的尾部添加一个元素啊,简单吧!

在这里插入图片描述

很明显,以上入队操作的时间复杂度是Ο(1),而这对于我们来说是不是还是可以接受的啊!

但是,这里我就要说但是了,如果我们考虑从队列的头部移除一个元素,那么这个出队操作的时间复杂度可就变高了。为啥我会这么说呢?你想啊,如果我们把元素a移除掉了,那么元素b是不是就得要成为新的头啊,而要成为新的头,元素b是不是就得取代掉原来元素a的位置,以及它之后的所有元素都得跟着它向前移动一格啊,对吧!

在这里插入图片描述

由此不难得出这样一个结论,即使用普通数组来实现队列,出队操作效率并不高。为啥我会这么说呢?因为使用普通数组来实现队列,普通数组它的头和尾是固定的,也即必须是0这个索引才能作为它的头。

而要是我们使用环形数组来实现队列,相对普通数组而言,那它可就更加自由了,即起点和终点会更为自由,而且这样一来,我们就不用再考虑什么数据的移动了。

关于以上使用环形数组来实现队列的第一个好处,我想我还是得跟大家好好唠唠,因为我怕有些同学看完这些干巴巴的文字之后,结果却不求甚解。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李阿昀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值