title: 基于数组实现循环队列(基于Java实现)
tags: 数组 循环队列


基于数组实现循环队列的方法原理:

我们在用数组实现队列的时候,发现当tail = n时,就会有数据搬移的操作,这样一来入队操作的性能就会受到影响。那我们可以使用循环队列来解决这一问题。

循环队列,顾名思义,它长得像一个环。如下图所示:

我们可以看到,图中这个队列的大小为 8,当前 head=4,tail=7。当有一个新的元素 a 入队时,我们放入下标为 7 的位置。但这个时候,我们并不把 tail 更新为 8,而是将其在环中后移一位,到下标为 0 的位置。当再有一个元素 b 入队时,我们将 b 放入下标为 0 的位置,然后 tail 加 1 更新为 1。所以,在 a,b 依次入队之后,循环队列中的元素就变成了下面的样子:

通过上述的这种方法,就能够成功地避免数据搬移操作。但是要实现这个循环队列的代码难度比之前的非循环队列的代码实现要更难。其最为关键的是,确定好队空和队满的判定条件。

在循环队列中,你会发现队空的判断条件是:tail = head,而队满的条件是:(tail+1) % n = head。为什么队满的条件会是这个呢?其实你根据上述循环队列的插入删除操作,你就会发现当队列满的时候,tail和head之间是相邻,相差为1,又因为插入的时候,主要是在移动tail指针,所以它的队满的操作为(tail+1) % n = head。如下图,为一张队满的示意图:

具体实现代码如下:

package com.company;public class CircularQueue {//数组:items,数组大小:nprivate String[] items;private int n = 0;//head表示对头下标,tail表示队尾下标private int head = 0;private int tail = 0;//申请一个大小为capacity的数组public CircularQueue(int capacity){items = new String[capacity];n = capacity;}//入队public boolean enqueue(String item){//队列满了if((tail + 1) % n == head) return false;items[tail] = item;tail = (tail + 1) % n;return true;}//出队public String dequeue(){//如果head==tail 表示队列为空if(head == tail) return null;String ret = items[head];head = (head + 1) % n;return ret;}public static void main(String[] args) {CircularQueue circularQueue = new CircularQueue(20);circularQueue.enqueue("abc");circularQueue.enqueue("edf");circularQueue.enqueue("hij");String a = circularQueue.dequeue();String b = circularQueue.dequeue();System.out.println(a);System.out.println(b);}
}

输出的结果:

abc
edf

通过上述的代码,可以知道虽然循环队列解决之前的数据搬移的情况,但是它带来一个缺点,就是当队列满的时候,tail指针指向的实际位置是没有存储数据的,所以,循环会浪费一个数组的存储空间。

欢迎浏览我的个人博客:https://chasing987.github.io/

基于数组实现循环队列(基于Java实现)相关推荐

  1. Java数组实现循环队列

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

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

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

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

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

  4. 循环队列的java结构_java数据结构之循环队列(数组实现)

    package com.ws.队列.数组环形队列; //环形数组队列 //判断满:尾+1%队列长度==头 //添加数据:要(尾+1)%数组长度 //取出数据:要(头+1)%数组长度 因为这两个都是循环 ...

  5. 数组模拟实现队列(Java语言描述)

    队列的实例:电影院购票.排队打饭.去麦当劳买吃的,银行排队叫号等等这些场合都需要排队,生活中的各种排队现象就展示了队列的实例 队列的介绍:队列是个有序列表 队列的实现方式: 数组 链表 注意:若使用数 ...

  6. 循环队列的java结构_Java数据结构——循环队列

    普通顺序队列存在的问题 在普通顺序队列中,入队的操作就是先将尾指针rear右移一个单位,然后将元素值赋值给rear单位.出队时,则是头指针front后移一个单位.像这样进行了一定数量的入队和出队操作后 ...

  7. 【数据结构与算法】循环队列的Java实现

    定义接口 public interface QueueInterface<T> {/*** 入队* 在队尾插入指定数据元素* @param element*/void enQueue(T ...

  8. 三星手机电池循环清零代码_数据结构(C语言)-循环队列基本操作

    队列是一种先进先出(first in first out,FIFO)的线性表,是一种常用的数据结构. 它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列 ...

  9. 【LeetCode 622 链表专项】设计循环队列

    文章目录 1. 题目 1.1 示例 1.2 说明 1.3 限制 2. 解法一(基于数组) 2.1 分析 2.2 解答 2.3 复杂度 2.4 代码优化 3. 解法二(基于链表) 3.1 分析 3.2 ...

最新文章

  1. Java编译分类:前端编译和后端编译
  2. 谷歌浏览器的翻译功能在哪_如何在Google表格中使用AND和OR功能
  3. mac按文件名查找文件_如何在Mac上查找和删除大文件
  4. jquery实现输入框动态增减
  5. python写脚本入门-学习Python的教程?:python 脚本菜鸟教程
  6. java 两个list相等_java 怎么比较两个list是否相同
  7. Asterconference Asia 2012 中国大会
  8. 拓端tecdat|R语言文本挖掘tf-idf,主题建模,情感分析,n-gram建模研究
  9. Flask-APScheduler使用教程
  10. 全年数学建模相关比赛
  11. 计算机不用鼠标怎么移动,如何在不使用鼠标的情况下拖动文件
  12. 程序员优秀开源免费软件推荐
  13. win7/ubuntu18 双系统安装和卸载
  14. ckc交易什么意思_股票熔断是什么意思啊?熔断机制对股民的影响有那些
  15. 矢量、栅格、瓦片地图傻傻分不清
  16. 贪心算法--最小耗费生成树(Prim算法)
  17. Windows--UEFI引导安装Win10
  18. 竞价广告每次点击出价多少钱是固定的吗?
  19. JVM:这次一定要搞懂字节码
  20. Word笔记----wps插入的图片像素降低了怎么办?

热门文章

  1. openssl、x509、crt、cer、key、csr、ssl、tls
  2. 全网最全的Postman接口自动化测试(小鸟成大鸟级攻略)
  3. Java数组中文排序_Java模块 -- 数组/集合中文汉字排序(支持生僻汉字)
  4. 关于微型计算机的ppt,微型计算机基础知识.ppt
  5. 微信小程序的省市区三级地址mysql_微信小程序picker实现的省市区三级联动
  6. HAproxy七层负载均衡——访问控制、动静分离、读写分离实现过程详解
  7. HashMap面试深入详解jdk1.8
  8. null未定义_PHP的isset()、is_null、empty()使用总结
  9. 定义const变量是不可以赋值_定义好 const 变量
  10. 微信公众号数据2019_公众号年度数据报告怎么写?2019年公众号年报可一键生成啦!...