环形队列:
1.思路:
rear:指向最后一个元素的后一个位置。空出来一个位置做约定。初始值为0.
front:指向第一个元素。初始值为0.
maxSize:为数组的长度。
队列是否满:(rear - front + maxSize + 1) % maxSize == 0;
简化为(rear + 1) % maxSize == 0;
队列的长度:(rear - front + maxSize) % maxSize;
这里明明(rear - front)%maxSize看起来也一样为什么要加上一个maxSize呢?
因为rear - front 有可能为负数类似于下面这种情况:
2.代码:
package circleQuaua;
public class CircleQuaua {
//创建环形队列并增取查
int maxSize;//队列的长度
int front;//队列头
int rear;//队列尾
int arr[];//数组
public CircleQuaua(int max){
maxSize = max;
arr = new int [max];
}
public boolean isFull(){
return (rear + 1) % maxSize == front;
}
public boolean isEmpty(){
return rear == front;
}
//增加一个元素
public void add(int n){
if(isFull()){
System.out.println("数组已经满啦");
return;
}
arr[rear] = n;
rear = (rear + 1) % maxSize;
}
//取出第一个元素
public int get(){
if(isEmpty()){
throw new RuntimeException("数组是空的");
}
int val = arr[front];
front = (front + 1) % maxSize;
return val;
}
//查看数组
public void check(){
if(isEmpty()){
throw new RuntimeException("数组是空的");
}
for (int i = front; i < front +size(); i++) {
System.out.print(arr[i%maxSize] + " ");
}
System.out.println();
}
//队列的长度
public int size(){
return (rear - front +maxSize) % maxSize;
}
}
3.难点:为什么要取余操作呢?
因为数组的长度是有限的当front或者rear已经等于数组的长度的时候想要在加一得回到数组的开头也就是arr[0];如果不取余就会造成越界异常。这也是环形队列为什么能重复使用数组的原因。