队列——数组结构实现(循环队列)

本文接上一篇队列文章

三、循环队列

循环队列的优点

  • 普通队列出队操作开销大:在出队操作时,索引为0后面的所有元素,都需要往前移动一位,元素越多,消耗的时间也越多,时间复杂度为O(N)

3.1 循环队列的逻辑

  1. 当元素较少时(tail位置在front后面),循环队列与普通队列出队操作一样,入队的元素将会放在tail的位置上,随后执行tail++操作;出队时front位置上的元素将会置null,随后执行front++操作;此时仍能保持着tail位置在front后面的状态,如下图所示:
    在这里插入图片描述
  2. 当元素继续添加,最后一个元素将放到索引为7的位置,此时tail位置将会移动到队首前面索引为0的位置上,此时tail在数组的索引为变为:(tail+ 1 )% capacity如下图所示:
    在这里插入图片描述
  3. 当元素继续添加时,元素将会在tail位置上添加,tail继续往后移动,如下图所示:
    在这里插入图片描述
  4. 继续添加元素,当tailfront还相距一个单位时,即此时数组还有一个空余存储空间,但当前数组已经不能继续实现循环队列的插入操作了,因为循环队列判断队列为空的条件就是front == tail,所以此时需要进行扩容操作;因此此处有意识的浪费了一个空间。
    此处可以推出,循环队列元素满的条件为:tail +1 == front(初步得出,后续会完善为(tail + 1) % capacity == front )
  5. 适当情况下,此若时持续进行出队操作,front的位置也将会从数组最右端跳转到数组最左端开始。此时front在数组的索引为变为:(front + 1 )% capacity

3.2 循环队列的结论

  • 循环队列:底层也是通过数组来实现,但是它的入队和出队操作,不能使用Array中封装的方法,而是需要重新去代码实现;
  • 通过front指向队首的位置,tail指向下一个元素即将插入的位置,即tail位置元素始终为null
    在这里插入图片描述
  • 循环队列是否为空的条件:front == tail;
  • 循环队列中tail位置在数组中对应的索引位置:(tail + 1) % capacity
  • 循环队列中front位置在数组中对应的索引位置:(front+ 1) % capacity
  • 循环队列装满的条件:(tail + 1) % capacity == front; 其中capacity为数组的空间大小;
    在这里插入图片描述

3.3 循环队列代码实现

代码如下:

package dataStructure.chapter3;

/**
 * @Author: zjtMeng
 * @Date: 2019/12/28 20:13
 * @Version 1.0
 */
public class LoopQueue<E> implements Queue<E> {
   

    private E[] data;
    private <
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值