一.简介
因为普通队列大小是固定值,在添加数据或取出数据之后,由于不是闭环,所以会报越界的异常,也就是说这个队列只能使用一次,因此环形队列更适合。举例如下:
Front代表队列的第一个元素,初始值为0;
rear代表队列的最后一个元素+1,(即预留一个空间的位置),rear的初始值为0;
判断队列是否是满的:(real+1)% maxsize == front(即rear+1和front所指的是同一个区域);(看做rear追赶front);
判断是否是空:rear==front(可以看做是front追赶rear,这样便于理解);
队列中的有效数据的个数:(rear+maxsize-front)%maxsize
二.相关方法
注:这些方法和属性都是在一个类中
一 创建相关属性和构造器
//队列最大数量
private int maxSize;
//队列头(指向第一个元素,初始值为0)
private int front;
//队列尾部(指向最后一个元素+1,初始值为0)
private int rear;
//队列
private int[] arr;
public Quere(int arrSize){
maxSize = arrSize;
arr = new int[maxSize];
front=0;
rear=0;
}
二.判断队列是否已满
public Boolean isFull(){
return (rear+1) % maxSize ==front;
}
三.判断队列是否为空
public Boolean isNull(){
return rear == front;
}
四.添加队列数据
public void add(int n){
//先判断队列是否是满的
if (isFull()){
System.out.println("队列已满,不能添加");
return;
}
//加入数据
arr[rear] = n;
rear = (rear+1) % maxSize;//rear要后移,取模才会重新指向前端,否则可能会报越界
}
五.取出数据
public int get(int n){
//先判断队列是否是空的
if (isNull()){
throw new RuntimeException("队列是空的,没有值可以取出");
}
//1.先把front对应的值保留到一个临时变量
int value = arr[front];
//2.将front后移,(取模后移)
front = (front+1)%maxSize;
//3.将临时变量返回
return value;
}
六.显示数据
public void show(int n){
//先判断队列是否是空的
if (isNull()){
throw new RuntimeException("队列是空的,没有值可以取出");
}
for (int i = front; i < front +size(); i++) {
System.out.print("arr["+i%maxSize+"] = "+arr[i%maxSize] );
}
}
//求出当前队列的有效值个数
public int size(){
return (rear+maxSize-front)%maxSize;
}