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

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

	//无参构造函数,用于队列的默认初始化
	public CircleSequenceQueue(){
		elementData=new Object[10];
		front=0;
		rear=0;
		QueueSize=elementData.length;
	}

	//带参构造函数,用于指定队列初始化长度
	public CircleSequenceQueue(int capacity){
		elementData=new Object[capacity];
		front=0;
		rear=0;
		QueueSize=elementData.length;
	}

	//队列的大小
		public int size(){
			return (rear-front+QueueSize)%QueueSize;
		}

		//判断队列是否为空
		public boolean isEmpty(){
			return front==rear;
		}

		//判断队列是否已满
		public boolean isFull(){
			return (rear+1)%QueueSize==front;
		}

		//入队列
		public void enQueue(int data){
			if(isFull()){
				throw new IndexOutOfBoundsException("队列已满");
			}

			elementData[rear]=data;//将data元素加入队尾
			rear=(rear+1)%QueueSize;//将rear指针向后移动一位,如果rear到最后则转移到数组头部
		}

		//出队列
		public Object deQueue(){
			if(isEmpty()){
				throw new IndexOutOfBoundsException("队列为空");
			}
			//得到对头元素
			Object data=elementData[front];
			//释放对头元素
			elementData[front]=null;
			//front指针向后移动一位,若到最后则转移到数组头部
			front=(front+1)%QueueSize;

			return data;
		}

		//得到对头元素,不删除
		public Object getFront(){
			if(isEmpty()){
				return null;
			}else{
				return elementData[front];
			}
		}

		//打印队列中的元素
		public void traverse(){
			if(isEmpty()){
				System.out.println("null");
			}else{
				int counter=0;//计数器
				for(int i=front;counter<=size();){
					if(elementData[i]!=null){
						System.out.print(elementData[i]+" ");
					}
					i=(i+1)%QueueSize;
					counter++;
				}
			}
			System.out.println();
		}

}

时间: 2024-10-03 14:01:57

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

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

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

数据结构6_顺序队列(循环队列)

本文实现了顺序队列,与链队列不同的是,顺序队列需要考虑一个问题, 问题情况如下, 解决办法:循环队列,当rear到分配的数组空间末尾时,转到数组头 但是当q.rear==q.front时,又如何区分一种是空队列,一种是满队列的情况呢 这里有两种方案 本次代码实现了第一种方法,同时设置了一个技术变量length,稍加改动便可实现第二个方法 代码如下: #include<iostream>using namespace std;//该顺序队列为循环队列,解决队尾指针达到最大值,队列中有空闲单元,但

Java数据结构和算法之栈与队列

二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为空栈. (3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表. 栈的修改是按后进先出的原则进行. 每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除. 图1 [示例]元素是以a1,a2,-,a

二、数据结构之栈、队列、循环队列

二.数据结构之栈.队列.循环队列 顺序栈 Stack.h 结构类型,函数声明: #ifndef _STACK_H_ #define _STACK_H_ typedef int SElementType; ///顺序栈 #define STACK_INIT_SIZE 20 #define STACK_INCREMENT 10 typedef struct { SElementType * base; SElementType * top; int stackSize;///当前栈的大小 }SqSt

c语言描述-链式队列与循环队列

我真的不喜欢写代码 队列的特点 先进先出,即只能从队尾插入元素,从队头删除元素 队列的链式存储结构 #include<stdio.h> #include <stdlib.h> #include<malloc.h> typedef struct QNode { int date; struct QNode *next; }QNode ,*QueuePtr; typedef struct { int size; //记录队列长度 QueuePtr front; //头指针

队列与循环队列

复习一下队列与循环队列的实现(C语言) 1.单链队列: 1 typedef struct QNode{ //若不写typedef,在C中每次定义QNode需要在前面加上struct,而C++不必 2 QElemType data; 3 struct QNode *next; 4 }QNode,*QueuePtr; 5 6 typedef struct{ //若不写结构体名,则需要加上typedef 7 QueuePtr front; 8 QueuePtr rear; 9 }LinkQueue;

数据结构总结系列(四)——循环队列之杨辉三角

今天我们来写一个循环队列的应用哦! 解决的是杨辉三角问题~~ 对于这样一个上下多层之间有密切联系的数据,如果只是用数组和循环来解决的话,显然会浪费大量的空间和时间, 所以我们用队列来解决这一问题: 之所以选用循环队列也是因为它对于空间的利用是非常有效的,方便我们的工作: 开始定义结构体: typedef struct //定义循环队列 { int data[MAXMIZE]; int Front; int Rear; }RollQueue; 这里的最大值(MAXMIZE)大家可以用宏定义来自己定

数据结构——队列及循环队列

说明:严蔚敏的<数据结构>(C语言版)学习笔记,记录一下,以备后面查看. #include <stdio.h> #include <stdlib.h> #define OK 1; #define ERROR -1; typedef int QElemType; typedef int Status; //定义队列节点 typedef struct QNode{ QElemType data; struct QNode *next; }QNode, *QueuePtr;

数据结构-队列(2)-循环队列

循环队列 此前,我们提供了一种简单但低效的队列实现. 更有效的方法是使用循环队列. 具体来说,我们可以使用固定大小的数组和两个指针来指示起始位置和结束位置. 目的是重用我们之前提到的被浪费的存储. 设计循环队列 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为"环形缓冲器".循环队列的一个好处是我们可以利用这个队列之前用过的空间.在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即