通过数组实现的环形队列
通过数组实现的队列可以分为两种:
1.一种是取出后数组空间不可用的顺序队列。也就是普通队列,这种队列最大的好处就是实现简单,但取出后空间不可使用
2.另一种就是接下来我要说的环形队列,它通过改变队尾指向,将满队列队尾指向队首来实现循环队列
队列
队列是一种特殊的线性表,它通过表前端(front)进行删除操作,通过表后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队首。
操作图解
(1)判断是否为空
当队尾(rear)和队首(front)相等时,队列为空
初始化:rear=front=0
front:指向队首
rear:指向有效数的下一个位置
代码:
//判断是否为空
public boolean isEmpty(){
if(rear==front){
//返回空结果
return true;
}
return false;
}
(2)判断队列是否满
图解:
当队尾rear+1=front时,环形队列为满
有同学会问:rear+1=0 ?
解释: 在添加操作时,让 rear=(rear+1)%队列.length 不仅可以使尾指针rear尾指针指向头,还可以防止数组越界。
代码:
//判断是否满
public boolean isFull(){
if((rear+1)%maxSize==front){
//返回满结果
return true;
}
return false;
}
(3)添加操作
添加操作队首fron不动,队尾rear递增,当rear+1=front时,队列为满。
代码 :
//添加方法
public void addArray(Object Data){
//判断是否满
if(isFull()){
System.out.println("队列已满,无法添加");
return;
}
array[rear]=Data;
rear=(rear+1)%maxSize;//限制rear的增长,防止数组越界
}
(4)取出操作
取出操作,队尾rear不动,队首front递增,当front==rear时,队列取空。
代码:
//取出方法
public Object getArray(){
//判断数组是否为空
if(isEmpty()){
System.out.println("数组为空,无法取出");
return null;
}
Object value=array[front];
front=(front+1)%maxSize;//防止数组越界
return value;
}
队列代码
主方法自己写即可
class CircleArray{
private int maxSize;//队列最大长度
private Object [] array;//通过数组实现队列
private int front;//指向环形数组第一位,默认为0
private int rear;//指向环形数组最后一位,默认为0
//构造方法
public CircleArray(int maxSize){
this.maxSize=maxSize;
array=new Object[maxSize];
front=rear=0;//也可以不初始化,默认为0
}
//判断是否为空
public boolean isEmpty(){
if(rear==front){
//返回空结果
return true;
}
return false;
}
/**
* @return
*/
//判断是否满
public boolean isFull(){
if((rear+1)%maxSize==front){
//返回满结果
return true;
}
return false;
}
//添加方法
public void addArray(Object Data){
//判断是否满
if(isFull()){
System.out.println("队列已满,无法添加");
return;
}
array[rear]=Data;
rear=(rear+1)%maxSize;//限制rear的增长,防止数组越界
}
//取出方法
public Object getArray(){
//判断数组是否为空
if(isEmpty()){
System.out.println("数组为空,无法取出");
return null;
}
Object value=array[front];
front=(front+1)%maxSize;//防止数组越界
return value;
}
//打印环形数组
public void showArray(){
//判断数组是否为空
if(isEmpty()){
System.out.println("数组为空,无法打印");
return;
}
//只要队列非空,i=(i+1)%maxSize)仔细品味
for(int i=front;i!=rear;i=(i+1)%maxSize){
System.out.print(array[i]+"\t");
}
System.out.println();
}
}
实现原理讲解
在进行实际操作时,maxSize数要比实际大1,因为在进行(rear+1)和 front 比较判断时(rear+1)实际上是一个虚拟空间占一位数组,当虚拟空间指向队列头时证明队列满