Java数组实现循环队列
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数组实现循环队列相关推荐
- Java数组实现循环队列的两种方法
用java实现循环队列的方法: 1.增加一个属性size用来记录目前的元素个数.目的是当head=rear的时候,通过size=0还是size=数组长度,来区分队列为空,或者队列已满. 2.数组中只存 ...
- 基于数组实现循环队列(基于Java实现)
title: 基于数组实现循环队列(基于Java实现) tags: 数组 循环队列 基于数组实现循环队列的方法原理: 我们在用数组实现队列的时候,发现当tail = n时,就会有数据搬移的操作,这样一 ...
- 20162316刘诚昊 用数组实现循环队列
20162316刘诚昊 2017-2018-2 <Java程序设计>用数组实现循环队列 实验要求 1 参考程序15.6给出方法deque,first,isEmpty,size,toStri ...
- java环形队列测试,JAVA数据结构之循环队列的实现
1.循环队列CircleQueue类的实现代码如下所示: public class CircleQueue { private Object[] array; private int capacity ...
- 循环队列真的没那么难,就那么几个注意点,附Java代码及运行效果
1. 队列 队列是一种常见的线性数据结构,满足先进先出(First In First Out),简称为FIFO,第一次看到FIFO还以为是单片机的输出输出什么的,见笑了.数据结构不太了解的话可以看看我 ...
- 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)
常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...
- Java中循环队列实现_Java循环队列的实现方法
Java循环队列的实现方法 时间:2017-09-13 来源:华清远见JAVA学院 生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题.那 ...
- java循环的概念_Java数据结构之循环队列简单定义与用法示例
本文实例讲述了Java数据结构之循环队列简单定义与用法.分享给大家供大家参考,具体如下: 一.概述: 1.原理: 与普通队列的区别在于循环队列添加数据时,如果其有效数据end == maxSize - ...
- 关于队列(数组队列,链表队列,循环队列)
下面是关于队列的一些基本操作: 1,数组仿真队列: #include<stdio.h> #define size 10 int queue[size]; int front=-1; int ...
最新文章
- 英国电信宣布2030年前碳排放削减87%
- 《SAP高级应用开发》---Idoc学习笔记
- python实现五大基本算法_算法基础:五大排序算法Python实战教程
- android自定义push通知_Android自定义Notification的一些坑
- 【英语学习】【Daily English】U05 Places L01 How can I get to the city museum?
- 怎么方便地不通过鼠标在应用之间复制/粘贴文本
- 6- vue django restful framework 打造生鲜超市 -完成商品列表页(下)
- TCP/IP概念及基础网络配置
- 中文文本纠错工具推荐:pycorrector
- 如何在html中加入注释,HTML如何加脚注(注释)?
- EXCEL如何将平均值加减标准差设置为科学计数法显示
- WZOI-285叠方块游戏
- java中字段可以取名is开头吗
- 【她的心你伤的起吗?】
- 谷歌 地图 android studio,Android Studio百度地图开发(一)
- 阿里国际站运营的核心指标是什么?
- 关于买房的后的人生感悟
- 计算机组成与设计ch3,计算机体系结构总结
- 织梦编辑器加HTML视频显示很小,织梦教程:去掉编辑器自动加div的方法即大小字情况...
- 校园版网络教学平台搭建方案(学生端)