Java实现循环队列

一、分析

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

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

    1、初始化循环队列

    2、销毁循环队列

    3、清空循环队列

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

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

    6、返回循环队列头元素

    7、向队尾插入元素

    8、删除并返回队头元素

    9、遍历循环队列

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

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

二、实现

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

 1 class InitQueue{
 2
 3     private int [] queue = null;
 4
 5     private int front = 0;
 6
 7     private int rear = 0;
 8
 9     private boolean empty = true;      //true表示循环队列为空
10
11     public InitQueue(int max) {       //构造指定大小的循环队列
12         this.queue = new int[max];
13     }
14 }

2、清空循环队列

1 public void clearQueue() {
2     this.front = 0;
3     this.rear = 0;
4     this.empty = true;
5 }

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

1 public boolean queueEmpty() {
2     if(this.empty == true) {
3         return true;
4     }else {
5         return false;
6     }
7 }

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

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

5、返回循环队列头元素

 1 public int [] getHead() {
 2
 3     if (this.empty == true) {
 4         return null;
 5     }
 6
 7     int [] i = new int[1];
 8     i[0] = queue[this.front];
 9     return i;
10 }

6、向队尾插入元素

 1 public boolean enQueue(int value) {
 2
 3     if (this.empty == false && this.front == this.rear) {
 4         return false;
 5     }
 6
 7     this.queue[this.rear] = value;
 8     this.rear = (this.rear + 1) % this.queue.length;
 9     this.empty = false;
10     return true;
11 }

7、删除并返回队头元素

 1 public int [] deQueue() {
 2
 3     if (this.empty == true) {
 4         return null;
 5     }
 6
 7     int [] i = new int[1];
 8     i[0] = this.queue[this.front];                //获取队头元素
 9
10     this.front = (this.front + 1) % this.queue.length;    //删除队头元素(front指针加一)
11
12     if(this.front == this.rear) {                 //如果循环队列变空,改变标志位
13         this.empty = true;
14     }
15     return i;
16 }

8、遍历循环队列

 1 public String queueTraverse() {                    //此处用输出循环队列表示遍历
 2
 3     String s = "";
 4     int i = this.front;                         //i指向第一个元素
 5
 6     if(this.front == this.rear && this.empty == false) {     //如果循环队列已满,取出第一个元素,i指向下一个元素
 7         s += this.queue[i] + "、";
 8         i = (i + 1) % this.queue.length;
 9     }
10
11     while (i != this.rear) {                      //如果未到末尾,则循环读取元素
12         s += this.queue[i] + "、";
13         i = (i + 1) % this.queue.length;
14     }
15
16     if(s.length() == 0) {                        //如果没有读取到元素,直接返回空字符串
17         return s;
18     }
19     return s.substring(0,s.length() - 1);              //除去最后的顿号返回
20 }

三、小结

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

原文地址:https://www.cnblogs.com/ysyasd/p/10807063.html

时间: 2024-08-29 16:19:13

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

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

用java实现循环队列的方法: 1.增加一个属性size用来记录目前的元素个数.目的是当head=rear的时候,通过size=0还是size=数组长度,来区分队列为空,或者队列已满. 2.数组中只存储数组大小-1个元素,保证rear转一圈之后不会和head相等,也就是队列满的时候,rear+1=head,中间刚好空一个元素:当rear=head的时候,一定是队列空了. import java.io.*; public class QueueArray { Object[] a; //对象数组,

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

数据结构Java实现07----队列:顺序队列&顺序循环队列.链式队列.顺序优先队列 一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-

Java用数组实现循环队列

复习了下数据结构,用Java的数组实现一下循环队列. 队列的类 1 //循环队列 2 class CirQueue{ 3 private int QueueSize; 4 private int front; 5 private int rear; 6 private int[] queueList ; 7 8 public CirQueue(int QueueSize){ 9 this.QueueSize = QueueSize; 10 queueList = new int[QueueSiz

JAVA实现数组队列,循环数组队列,链式队列

/** * 文件名:QueueText.java * 时间:2014年10月22日下午9:05:13 * 作者:修维康 */ package chapter3; /** * 类名:ArrayQueue * 说明:队列的数组实现 */ class ArrayQueue<AnyType>{ private static final int DEFAULT_CAPACITY = 10; private int front;//队头 private int rear;//队尾 private int

Java数据结构系列之——队列(2):循环队列的顺序存储结构及其实现

package queue.circleSequenceQueue; /** * 这里我们规定队列满时数组中还有一个空闲空间,不允许将数组中的空间全部存满 * 循环队列满的条件是:(rear+1)%QueueSize==front * 长度计算公式为:(rear-front+QueueSize)%QueueSize * @author wl */ public class CircleSequenceQueue { Object[] elementData;//数组用于存放队列元素 int fr

Java 循环队列的实现

队列概念 队列(Queue)是限定只能在一端插入.另一端删除的线性表.允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear),没有元素的队列称为“空队列”. 队列具有先进先出(FIFO)的特性. 普通顺序队列存在的问题 在普通顺序队列中,入队的操作就是先将尾指针rear右移一个单位,然后将元素值赋值给rear单位.出队时,则是头指针front后移一个单位.像这样进行了一定数量的入队和出队操作后,可能会出现这样的情况: 尾指针rear已指到数组的最后有一个元素,即rear==Ma

九 、循环队列的java实现

原理: 接上一回队列的问题,上节队列弹出之后再插入会报出数组越界.所以这节改成循环队列. 所谓循环队列就是删除到队尾后重新指向队头,插入数据满了之后重新指向队头,实现一个循环. 运行结果图: 可以看出弹出全部的数据后,是可以重新插入数据的.而且重新插入的数据是可以重新弹出的.因此这个循环队列是有效的!!! 下面甩出源代码,其实也就是在上节队列的基础上对于插入数据和删除数据进行一个判断. public class MycycleQueue { private int[] array; //底层数组

队列及循环队列(Java实现)

package ch03; /* * 队列类 */ public class MyQueue { // 底层实现是一个数组 private long[] arr; // 有效数据大小 private int elements; // 队头 private int front; // 队尾 private int end; /** * 默认构造方法 */ public MyQueue() { arr = new long[10]; elements = 0; front = 0; end = -1

hdu 1175 连连看(模拟循环队列)

连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18149    Accepted Submission(s): 4741 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条