一、分析

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

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

    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. Zookeeper原理 二

    Zookeeper到底是什么!? 学一个东西,不搞明白他是什么东西,哪还有心情学啊!! 首先,Zookeeper是Apache的一个java项目,属于Hadoop系统,扮演管理员的角色. 然后看到官网 ...

  2. HMM 隐马尔科夫 Python 代码

    import numpy as np # -*- codeing:utf-8 -*- __author__ = 'youfei' # 隐状态 hidden_state = ['sunny', 'rai ...

  3. Contos 安装Tomcat

    # 下载安装包 wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.40/bin/apache-tomcat-8. ...

  4. Educational Codeforces Round 64 (Rated for Div. 2) A,B,C,D,E,F

    比赛链接: https://codeforces.com/contest/1156 A. Inscribed Figures 题意: 给出$n(2\leq n\leq 100)$个数,只含有1,2,3 ...

  5. Java基础_死锁、线程组、定时器Timer

    一.死锁问题: 死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不可能正常终止. 比如,线程一需要第一把所,此时锁处于空闲状态,给了 ...

  6. The JAVA_HOME environment variable is not defined correctly的错误

    The JAVA_HOME environment variable is not defined correctlyThis environment variable is needed to ru ...

  7. leetcode16 最接近的三数之和

    做了几周的hard之后,这道题居然轻易就解出来了,稍微debug了一下就ac了,算是有了一丢丢提高把: 思路 这道题因为和三数之和很像,所以充分利用双指针的思想:先排序,然后再固定一个数i,i取值从[ ...

  8. acl设置问题

    在学习nfs服务配置的时候用到了acl规则(服务配置文件权限设置可写,但是由于客户端映射,不能写入,所以要设置系统权限),但是遇到了一个小小的问题:一.当使用-x选项取消规则的时候,再次查看权限后面仍 ...

  9. 从源码看 Vue 中的 Mixin

    最近在做项目的时候碰到了一个奇怪的问题,通过 Vue.mixin 方法注入到 Vue 实例的一个方法不起作用了,后来经过仔细排查发现这个实例自己实现了一个同名方法,导致了 Vue.mixin 注入方法 ...

  10. HDFS的基础与操作

    一 HDFS概念 1.1 概念 HDFS,它是一个文件系统,全称:Hadoop Distributed File System,用于存储文件通过目录树来定位文件:其次,它是分布式的,由很多服务器联合起 ...