Java数组实现循环队列

上一节(Java实现队列——顺序队列、链式队列)我们使用数组实现了顺序队列,但是在tail == n时会有数据搬移操作,这样入队操作性能就会受到影响。这里我们使用循环队列的解决思路。

循环队列

顾名思义,首尾相连就形成了循环队列,如下图所示:

实现循环队列最关键的部分是确定队列何时为空何时满。在用数组实现的非循环队列中,队满的判断条件是tail == n,队空的判断条件是head == tail。在循环队列中,队列为空的判断条件仍然是head == tail,但队列满的判断条件有所更改,是( tail + 1 ) % capacity == head
另外一点需要注意的是,当队列满时,tail指针指向的位置实际上是没有存储数据的,所以会浪费一个数组的存储空间。

代码实现如下:

public class CircularQueue implements QueueInterface {private String[] values;// 容器private int capacity = 0;// 容量// head 表示队头下标,tail表示对尾下标private int head = 0;private int tail = 0;public CircularQueue(int capacity) {values = new String[capacity];this.capacity = capacity;}@Overridepublic Boolean enqueue(String value) {// 队列满了if ((tail + 1) % capacity == head) {return false;}values[tail] = value;tail = (tail + 1) % capacity;return true;}@Overridepublic String dequeue() {// 如果head == tail 表示队列为空if (head == tail) {return null;}String ret = values[head];head = (head + 1) % capacity;return ret;}@Overridepublic String toString() {return "CircularQueue{" +"values=" + Arrays.toString(values) +", capacity=" + capacity +", head=" + head +", tail=" + tail +'}';}
}

测试代码:

    CircularQueue cq = new CircularQueue(10);System.out.println(cq);System.out.println();//正常添加的数据System.out.println("正常添加的数据:");for (int i = 0; i < 9; i++) {System.out.println("cq.enqueue():" + cq.enqueue("" + i + i + i));System.out.println(cq);}System.out.println();// 队列满了以后添加数据System.out.println("队列满了以后添加数据:");System.out.println("cq.enqueue():" + cq.enqueue("aaa"));System.out.println(cq);System.out.println();// 清空队列System.out.println("清空队列:");for (int i = 0; i < 9; i++) {System.out.println("cq.dequeue():" + cq.dequeue());System.out.println(cq);}System.out.println();// 队列清空以后,继续清空System.out.println("队列清空以后,继续清空:");System.out.println("cq.dequeue():" + cq.dequeue());System.out.println(cq);

输出结果:符合期望

CircularQueue{values=[null, null, null, null, null, null, null, null, null, null], capacity=10, head=0, tail=0}正常添加的数据:
cq.enqueue():true
CircularQueue{values=[000, null, null, null, null, null, null, null, null, null], capacity=10, head=0, tail=1}
cq.enqueue():true
CircularQueue{values=[000, 111, null, null, null, null, null, null, null, null], capacity=10, head=0, tail=2}
cq.enqueue():true
CircularQueue{values=[000, 111, 222, null, null, null, null, null, null, null], capacity=10, head=0, tail=3}
cq.enqueue():true
CircularQueue{values=[000, 111, 222, 333, null, null, null, null, null, null], capacity=10, head=0, tail=4}
cq.enqueue():true
CircularQueue{values=[000, 111, 222, 333, 444, null, null, null, null, null], capacity=10, head=0, tail=5}
cq.enqueue():true
CircularQueue{values=[000, 111, 222, 333, 444, 555, null, null, null, null], capacity=10, head=0, tail=6}
cq.enqueue():true
CircularQueue{values=[000, 111, 222, 333, 444, 555, 666, null, null, null], capacity=10, head=0, tail=7}
cq.enqueue():true
CircularQueue{values=[000, 111, 222, 333, 444, 555, 666, 777, null, null], capacity=10, head=0, tail=8}
cq.enqueue():true
CircularQueue{values=[000, 111, 222, 333, 444, 555, 666, 777, 888, null], capacity=10, head=0, tail=9}队列满了以后添加数据:
cq.enqueue():false
CircularQueue{values=[000, 111, 222, 333, 444, 555, 666, 777, 888, null], capacity=10, head=0, tail=9}清空队列:
cq.dequeue():000
CircularQueue{values=[000, 111, 222, 333, 444, 555, 666, 777, 888, null], capacity=10, head=1, tail=9}
cq.dequeue():111
CircularQueue{values=[000, 111, 222, 333, 444, 555, 666, 777, 888, null], capacity=10, head=2, tail=9}
cq.dequeue():222
CircularQueue{values=[000, 111, 222, 333, 444, 555, 666, 777, 888, null], capacity=10, head=3, tail=9}
cq.dequeue():333
CircularQueue{values=[000, 111, 222, 333, 444, 555, 666, 777, 888, null], capacity=10, head=4, tail=9}
cq.dequeue():444
CircularQueue{values=[000, 111, 222, 333, 444, 555, 666, 777, 888, null], capacity=10, head=5, tail=9}
cq.dequeue():555
CircularQueue{values=[000, 111, 222, 333, 444, 555, 666, 777, 888, null], capacity=10, head=6, tail=9}
cq.dequeue():666
CircularQueue{values=[000, 111, 222, 333, 444, 555, 666, 777, 888, null], capacity=10, head=7, tail=9}
cq.dequeue():777
CircularQueue{values=[000, 111, 222, 333, 444, 555, 666, 777, 888, null], capacity=10, head=8, tail=9}
cq.dequeue():888
CircularQueue{values=[000, 111, 222, 333, 444, 555, 666, 777, 888, null], capacity=10, head=9, tail=9}队列清空以后,继续清空:
cq.dequeue():null
CircularQueue{values=[000, 111, 222, 333, 444, 555, 666, 777, 888, null], capacity=10, head=9, tail=9}

完整代码请查看

项目中搜索SingleLinkedList即可。
github传送门 https://github.com/tinyvampirepudge/DataStructureDemo

gitee传送门 https://gitee.com/tinytongtong/DataStructureDemo

参考:
队列:队列在线程池等有限资源池中的应用

Java数组实现循环队列相关推荐

  1. Java数组实现循环队列的两种方法

    用java实现循环队列的方法: 1.增加一个属性size用来记录目前的元素个数.目的是当head=rear的时候,通过size=0还是size=数组长度,来区分队列为空,或者队列已满. 2.数组中只存 ...

  2. 基于数组实现循环队列(基于Java实现)

    title: 基于数组实现循环队列(基于Java实现) tags: 数组 循环队列 基于数组实现循环队列的方法原理: 我们在用数组实现队列的时候,发现当tail = n时,就会有数据搬移的操作,这样一 ...

  3. 20162316刘诚昊 用数组实现循环队列

    20162316刘诚昊 2017-2018-2 <Java程序设计>用数组实现循环队列 实验要求 1 参考程序15.6给出方法deque,first,isEmpty,size,toStri ...

  4. java环形队列测试,JAVA数据结构之循环队列的实现

    1.循环队列CircleQueue类的实现代码如下所示: public class CircleQueue { private Object[] array; private int capacity ...

  5. 循环队列真的没那么难,就那么几个注意点,附Java代码及运行效果

    1. 队列 队列是一种常见的线性数据结构,满足先进先出(First In First Out),简称为FIFO,第一次看到FIFO还以为是单片机的输出输出什么的,见笑了.数据结构不太了解的话可以看看我 ...

  6. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  7. Java中循环队列实现_Java循环队列的实现方法

    Java循环队列的实现方法 时间:2017-09-13     来源:华清远见JAVA学院 生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题.那 ...

  8. java循环的概念_Java数据结构之循环队列简单定义与用法示例

    本文实例讲述了Java数据结构之循环队列简单定义与用法.分享给大家供大家参考,具体如下: 一.概述: 1.原理: 与普通队列的区别在于循环队列添加数据时,如果其有效数据end == maxSize - ...

  9. 关于队列(数组队列,链表队列,循环队列)

    下面是关于队列的一些基本操作: 1,数组仿真队列: #include<stdio.h> #define size 10 int queue[size]; int front=-1; int ...

最新文章

  1. 英国电信宣布2030年前碳排放削减87%
  2. 《SAP高级应用开发》---Idoc学习笔记
  3. python实现五大基本算法_算法基础:五大排序算法Python实战教程
  4. android自定义push通知_Android自定义Notification的一些坑
  5. 【英语学习】【Daily English】U05 Places L01 How can I get to the city museum?
  6. 怎么方便地不通过鼠标在应用之间复制/粘贴文本
  7. 6- vue django restful framework 打造生鲜超市 -完成商品列表页(下)
  8. TCP/IP概念及基础网络配置
  9. 中文文本纠错工具推荐:pycorrector
  10. 如何在html中加入注释,HTML如何加脚注(注释)?
  11. EXCEL如何将平均值加减标准差设置为科学计数法显示
  12. WZOI-285叠方块游戏
  13. java中字段可以取名is开头吗
  14. 【她的心你伤的起吗?】
  15. 谷歌 地图 android studio,Android Studio百度地图开发(一)
  16. 阿里国际站运营的核心指标是什么?
  17. 关于买房的后的人生感悟
  18. 计算机组成与设计ch3,计算机体系结构总结
  19. 织梦编辑器加HTML视频显示很小,织梦教程:去掉编辑器自动加div的方法即大小字情况...
  20. 校园版网络教学平台搭建方案(学生端)

热门文章

  1. ESTIMATE 包 error/报错 无法匹配基因
  2. C++primer plus学习笔记
  3. Linux内核基础篇——常用调试技巧汇总
  4. 年后创业,该如何选择适合年轻人的小成本创业项目?
  5. ROK(万国觉醒)服务器卡顿解决方案
  6. 数据思索和应用一 :什么是数据
  7. android家长控制软件,三款家长控制软件,你猜家长更爱谁?
  8. 转载 一个小时学会MySQL数据库(3)
  9. 凸透镜成像原理以及镜头选型
  10. 格式工厂-格式转换器(老版本)