上一讲,我们就已经分析过了,使用数组来模拟队列的这种实现方式隐藏着一个很大的问题,即数组使用过一次之后便不能再使用了,也就是说压根就没有达到复用的效果。因此,要想解决这个隐患问题,那我们就得想办法让数组复用起来才行,也就是说如果我们从这个数组里面取出一个东东之后,那么空出的这个空间还得能被我们再次利用。
那怎么才能让数组复用起来呢?很简单,只须将其改进成环形数组即可,也就是说现在我们可就要用环形数组来模拟队列了,废话不多说,接下来就让我们来看看使用环形数组来模拟队列的一个思路分析吧!
什么是环形数组?
现在我们是要使用环形数组来模拟队列,那到底什么是环形数组呢?看下图,能一眼就看出环形数组其实就是一个大小固定、首尾相连的数组吧!
要不怎么说它是一个环形数组呢?你看,以上环形数组共有0、1、2、3、4五个索引,其中,索引4这个位置是不是就毗邻着索引0这个位置啊!那这可不就构成一个环形数组了嘛!当然,在物理上它还是一个普通的线性结构,只不过我们可以通过程序控制让其像一个环而已,环嘛,不就是其索引4结束之后下一个索引又变成0了嘛,对不对,首尾相连嘛!
使用环形数组来实现队列的好处
咱们先来看一下使用普通数组来实现队列是怎样一个情况,以此作为对比,我们也就不难得出使用环形数组来实现队列的好处了。
使用普通数组来实现队列,涉及到队列的两个常见操作是不是就是下面这两个啊!
- 向队列的尾部添加一个元素,即入队操作;
- 从队列的头部移除一个元素,即出队操作。
是个人都知道上面队列的两个常见操作吧!既然大家都知道了,那下面咱们就来分析分析一下这俩操作的效率如何吧!
假设此时我们使用普通数组来实现了一个队列,如下图所示。
不难想见,如果此时我们向队列的尾部新增一个元素,比如e
,那么是不是就得像下面这样在数组的尾部添加一个元素啊,简单吧!
很明显,以上入队操作的时间复杂度是Ο(1)
,而这对于我们来说是不是还是可以接受的啊!
但是,这里我就要说但是了,如果我们考虑从队列的头部移除一个元素,那么这个出队操作的时间复杂度可就变高了。为啥我会这么说呢?你想啊,如果我们把元素a
移除掉了,那么元素b
是不是就得要成为新的头啊,而要成为新的头,元素b
是不是就得取代掉原来元素a
的位置,以及它之后的所有元素都得跟着它向前移动一格啊,对吧!
由此不难得出这样一个结论,即使用普通数组来实现队列,出队操作效率并不高。为啥我会这么说呢?因为使用普通数组来实现队列,普通数组它的头和尾是固定的,也即必须是0这个索引才能作为它的头。
而要是我们使用环形数组来实现队列,相对普通数组而言,那它可就更加自由了,即起点和终点会更为自由,而且这样一来,我们就不用再考虑什么数据的移动了。
关于以上使用环形数组来实现队列的第一个好处,我想我还是得跟大家好好唠唠,因为我怕有些同学看完这些干巴巴的文字之后,结果却不求甚解。