java循环队列判断为空_Java - 可循环队列

队列是一种特殊的线性表,是一种先进先出的数据结构。只允许在表的前端进行删除操作,在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

简单的循环队列实现比较容易,队头获取数据、队头弹出获取数据,队尾插入数据。下面来研究一下可以无限循环使用的队列。思路如下:

1、数据结构

int[] elements:底层采用数组实现,用来存储队列的所有元素;

maxSize:数组最大容量;

first:队头索引属性;

size:队列有效元素的个数;

1,2,3,4,5

2、算法

这里采用最大容量为5的队列来说明,即maxSize设为5。

(1) 第一次使用队列时,依次添加5个元素:1,2,3,4,5,first指向1,size 大小为5,maxSize为5。

1,2,3,4,5

算法很简单:添加1时,各种为空、队列已满的判断条件暂时省掉;

add(int value) {

if (size == 0) {

first = 0;

}

elements[size++] = value;

}

(2) 调用2次pop()方法弹出获取队列元素,此时队列数据结构如下:

1,2,3,4,5

size为3,first指向3,maxSize始终为5。

pop() {

size--;

return elements[first++];

}

(3) 此时我们再向队列添加元素6、7,此时队列数据结构如下:

1,2,3,4,5

6,7,3,4,5

访问的顺序应该为:3, 4, 5, 6, 7,其中size为5,first指向3。此时步骤1、2的算法明显不支持数组的循环使用,我们需要利用取模来循环添加数据到数组,具体算法如下:

public classMyQueue {/*** 底层数组*/

private int[] elements;/*** 队列最大容量*/

private intmaxSize;/*** 队列头索引*/

private intfirst;/*** 队列有效元素的个数*/

private intsize;public MyQueue(intmaxSize) {this.maxSize =maxSize;

elements= new int[maxSize];

first= -1;

size= 0;

}/*** 添加元素

*

*@paramvalue*/

public void add(intvalue) {if(isFull()) {throw new RuntimeException("队列已满。");

}if(isEmpty()) {

first= 0;

}//队列未满但是(first + size >= maxSize)时,说明数组elements的first索引之后所有位置已填满,//first索引之前有空位置可以插入元素, 新增元素插入位置算法为:(first + size) % maxSize。

if (first + size >=maxSize) {

elements[(first+ size) % maxSize] =value;

}else{

elements[first+ size] =value;

}

size++;

}/*** 获取队列元素,只能取队列头,弹出式获取。

*

*@return

*/

public intpop() {if(isEmpty()) {throw new RuntimeException("队列为空。");

}

size--;//first 索引指向maxSize - 1时,即first已到达数组最后的位置,则弹出之后需将first指向第1个元素,//实现数组循环使用

if (first == maxSize -1) {int tmp =elements[first];

first= 0;returntmp;

}else{return elements[first++];

}

}/*** 获取元素,不弹出

*

*@return

*/

public intpeek() {if(isEmpty()) {throw new RuntimeException("队列为空。");

}returnelements[first];

}public booleanisFull() {return size ==maxSize;

}public booleanisEmpty() {return size <= 0;

}public voiddisplay() {if(isEmpty()) {

System.out.println("Queue is empty.");return;

}

StringBuilder str= newStringBuilder();for (int i = first; i < first + size; i++) {if (i >=maxSize) {

str.append(elements[i% maxSize] + ", ");

}else{

str.append(elements[i]+ ", ");

}

}

System.out.println(str.substring(0, str.length() - 2));

}public intsize() {returnsize;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值