一、分析

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

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

    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. 数据结构实验之链表九:双向链表(SDUT 2054)

    #include <bits/stdc++.h> using namespace std; typedef struct node { int data; struct node *nex ...

  2. 第四章 Python数据分析-描述性分析

    Python基础统计 统计函数:describe() 常用的统计指标函数: 统计函数 注释 (@数据分析-jacky) size 计算 sum 求和 mean 平均值 var 方差 std 标准差

  3. NIO学习总结

    第一.NIO概述 java.nio 全称 java non-blocking IO,是指 JDK 提供的新 API.从 JDK1.4 开始,Java 提供了一系列改进的输入/输出的新特性,被统称为 N ...

  4. 事件处理机制与Handler消息传递机制

    一.基于监听的事件处理机制 基于监听的时间处理机制模型: 事件监听机制中由事件源,事件,事件监听器三类对象组成 处理流程如下: Step 1:为某个事件源(组件)设置一个监听器,用于监听用户操作 St ...

  5. 【APUE】第3章 文件I/O (3) 文件共享、原子操作、函数dup/dup2、函数sync/fsync/fdatasync、函数fcntl、函数ioct1、目录/dev/fd 使用说明

    1.文件共享 UNIX系统支持在不同的进程间共享打开文件.为了说明这种共享,以下介绍内核用于所有I/O的数据结构. 内核使用3种数据结构表示打开文件,它们之间的关系决定了在文件共享方面一个进程对另一个 ...

  6. JAVA之自动内存管理机制

    一.内存分配 1.JVM体系结构 2.运行时数据区域 3.内存分配二.内存回收 1.垃圾收集算法 2.垃圾收集器三.相关参考一.内存分配JVM体系结构 在了解自动内存管理的内存分配之前,我们先看下JV ...

  7. 来谈谈MySQL的临时表,到底是个什么东西,以及怎么样产生的

    介绍临时表之前,我们首先来看这么一句语句: CREATE TABLE `words` ( `id` ) NOT NULL AUTO_INCREMENT, `word` ) DEFAULT NULL, ...

  8. 关于Math.random()

    关于 Math.random() ,以前经常搞混淆,这次写个笔记专门记录下: Math.random()  : 返回的是 0~1 之间的一个随机小数0<=r<1,即[0,1); 注意:这里 ...

  9. linux下的开源NFC协议栈

    1. 协议栈名称 neardal 2. 源码 https://github.com/connectivity/neardal.git 3. 由谁维护? intel 4. 基于neardal的nfc协议 ...

  10. numpy基本方法总结

    NumPy基本方法 一.数组方法 创建数组:arange()创建一维数组:array()创建一维或多维数组,其参数是类似于数组的对象,如列表等 读取数组元素:如a[0],a[0,0] 数组变形:如b= ...