一、分析

  队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素。允许插入的一端称为队尾,允许删除的一端称为队头。

  循环队列是一种以顺序存储结构表示的队列,为了解决“假溢出”问题而将它设计成头尾相接的循环结构,它的基本操作如下:

    1、初始化循环队列

    2、销毁循环队列

    3、清空循环队列

    4、检测循环队列是否为空

    5、返回循环队列的元素个数

    6、返回循环队列头元素

    7、向队尾插入元素

    8、删除并返回队头元素

    9、遍历循环队列

  在循环队列中,除了用一组地址连续的存储单元依次存储从队头到队尾的元素外,还需要附设两个整型变量front和rear分别指示队头和队尾的位置。

  在Java中,我们可以将循环队列视作一个类,通过成员变量数组来表示一组地址连续的存储单元,再定义两个成员变量front和rear,将循环队列的基本操作定义成类的方法,循环效果则用“模”运算实现,以此来实现循环队列。这样,初始化循环队列就是将类实例化,销毁就是销毁实例化出来的对象。

二、实现

1、定义类属性和构造函数

 class InitQueue{

     private int [] queue = null;

     private int front = 0;

     private int rear = 0;

     private boolean empty = true;      //true表示循环队列为空

     public InitQueue(int max) {       //构造指定大小的循环队列
this.queue = new int[max];
}
}

2、清空循环队列

 public void clearQueue() {
this.front = 0;
this.rear = 0;
this.empty = true;
}

3、检测循环队列是否为空

 public boolean queueEmpty() {
if(this.empty == true) {
return true;
}else {
return false;
}
}

4、返回循环队列的元素个数

 public int queueLength() {
if (this.front == this.rear && this.empty == false) {
return this.queue.length;                             //如果循环队列已满,返回数组长度即元素个数
}
return (this.rear - this.front + this.queue.length) % this.queue.length;   //否则,取模运算得到长度
}

5、返回循环队列头元素

 public int [] getHead() {

     if (this.empty == true) {
return null;
} int [] i = new int[1];
i[0] = queue[this.front];
return i;
}

6、向队尾插入元素

 public boolean enQueue(int value) {

     if (this.empty == false && this.front == this.rear) {
return false;
} this.queue[this.rear] = value;
this.rear = (this.rear + 1) % this.queue.length;
this.empty = false;
return true;
}

7、删除并返回队头元素

 public int [] deQueue() {

     if (this.empty == true) {
return null;
} int [] i = new int[1];
i[0] = this.queue[this.front];               //获取队头元素 this.front = (this.front + 1) % this.queue.length;   //删除队头元素(front指针加一) if(this.front == this.rear) {                //如果循环队列变空,改变标志位
this.empty = true;
}
return i;
}

8、遍历循环队列

 public String queueTraverse() {                    //此处用输出循环队列表示遍历

     String s = "";
int i = this.front;                        //i指向第一个元素 if(this.front == this.rear && this.empty == false) {    //如果循环队列已满,取出第一个元素,i指向下一个元素
s += this.queue[i] + "、";
i = (i + 1) % this.queue.length;
} while (i != this.rear) {                     //如果未到末尾,则循环读取元素
s += this.queue[i] + "、";
i = (i + 1) % this.queue.length;
} if(s.length() == 0) {                       //如果没有读取到元素,直接返回空字符串
return s;
}
return s.substring(0,s.length() - 1);             //除去最后的顿号返回
}

三、小结

  以上就是循环队列用Java的实现,由于只定义了整数的数组,因此只能操作整数数据,但循环队列的基本思想都已实现。

Java实现循环队列的更多相关文章

  1. java数据结构---循环队列

    #java学习经验总结------循环队列的实现(数组) package datastructure;/*数组实现循环队列 队列first in first out*/ public class Ci ...

  2. java算法--循环队列

    循环队列 我们再用队列得时候不知道发没发现这样一个问题. 这是一个只有三个位置得队列,在进行三次加入(addqueue)操作和三次取出(get)操作之后再进行加入操作时候的样子.明显可以看到,队列已经 ...

  3. Java数据结构——循环队列

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

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

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

  5. 用数组实现队列(顺序队列&循环队列)

    用数组实现队列(顺序队列&循环队列) 顺序队列 ️ 队列(先进先出) 几个问题: 队列方法:入队.出队 队列的存储:即队首队尾两个指针, 扩容:如果队列容量不够了,应该扩容,如果队尾没有位置了 ...

  6. 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列

    一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...

  7. Java实现一个简单的循环队列

    在某些时候,我们不能被要求像数组一样可以使用索引随机访问,而是需要被限制顺序处理业务,今天介绍一种先进先出(FIFO)的线性数据结构:队列, 当然,还有后进先出(LIFO)的处理方式,即为栈(后续有时 ...

  8. Java数据类型Stack栈、Queue队列、数组队列和循环队列的比较

    判断括号是否匹配:调用java本身 import java.util.Stack; public class Solution { public boolean isValid(String s){ ...

  9. 【Java】 大话数据结构(7) 循环队列和链队列

    本文根据<大话数据结构>一书,实现了Java版的循环队列.链队列. 队列:只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 1.循环队列 队列的顺序储存结构:用数组存储队列,引入 ...

随机推荐

  1. 【原创】tarjan算法初步(强连通子图缩点)

    [原创]tarjan算法初步(强连通子图缩点) tarjan算法的思路不是一般的绕!!(不过既然是求强连通子图这样的回路也就可以稍微原谅了..) 但是研究tarjan之前总得知道强连通分量是什么吧.. ...

  2. 【线性代数】3-5:独立性,基和维度(Independence,Basis and Dimension)

    title: [线性代数]3-5:独立性,基和维度(Independence,Basis and Dimension) categories: Mathematic Linear Algebra ke ...

  3. Python数据抓取(1) —数据处理前的准备

    (一)数据抓取概要 为什么要学会抓取网络数据? 对公司或对自己有价值的数据,80%都不在本地的数据库,它们都散落在广大的网络数据,这些数据通常都伴随着网页的形式呈现,这样的数据我们称为非结构化数据 如 ...

  4. nginx实现动静分离的负载均衡集群

    实战: 一.源码编译安装nginx [root@tiandong63 ~]#yum groupinstall "Development Tools" "Developme ...

  5. IntelliJ IDEA 2017 上传本地项目至码云

    码云免费还挺好用,和Git类似.首先需要注册一个码云.这个就不介绍了. 点击加号,新建一个项目. 填写项目名称.  复制一下你的项目地址.  如图勾选.将项目至于git管理. 首先commit.快捷按 ...

  6. MySort(选做)

    一.题目要求 注意:研究sort的其他功能,要能改的动代码,需要答辩 模拟实现Linux下Sort -t : -k 2的功能. 要有伪代码,产品代码,测试代码(注意测试用例的设计) 参考 Sort的实 ...

  7. shell脚本备份当前日期文件

    #!/bin/bash #一月前 historyTime=$(date "+%Y-%m-%d %H" -d '1 month ago') echo ${historyTime} h ...

  8. HearthBuddy炉石兄弟 如何调试ai

    Sepefeets's update to botmaker's Silverfish AI This AI is a Custom Class for Hearthranger and Hearth ...

  9. LC 926. Flip String to Monotone Increasing

    A string of '0's and '1's is monotone increasing if it consists of some number of '0's (possibly 0), ...

  10. ResourceUtils 创建资源目录工具类

    package com.jcf.utilsdemo; import android.content.Context; import android.content.res.Resources; pub ...