看了尚硅谷数据结构与算法的视频,跟着写了一个使用数组来实现环形队列的代码,插个眼记录一下。
就这个实现而言,主要需要注意的是:头指针、尾指针循环时采取的“取模”操作,以及存在一个数组元素空间的预留
这个实现,其实有很多种方法,这只是其中一种
代码如下:
class CircleArray{
private int maxSize; //数组的最大容量
private int front; //队列头
private int rear; //队列尾
private int[] arr; //存放数据
//创建构造器
// 按我理解,构造器应该就是一个初始化的工具
// 调用格式应该是:ArrayQueue xxx = new ArrayQueue(数组的最大容量)
//越来越感觉这像 C 的结构体
public CircleArray(int arrMaxSize){
maxSize = arrMaxSize;
front = 0; //指向队列头部,即头指针
rear = 0; //指向队列尾部,即尾指针
arr = new int[maxSize];
}
//判断队列满
//boolean型,返回 ture 或 false
public boolean isFull(){
return (rear+1) % maxSize == front;
}
//判断队列空
public boolean isEmpty(){
return rear == front;
}
//写数据,仅限 int 型
public void addQueue(int n){
//判断队列是否满
if(isFull()){
System.out.println("队列已满,不能加入数据");
return;
}
arr[rear] = n; //写数据入队列
rear = (rear + 1) % maxSize; //尾指针后退一位, 取模是必须考虑的,因为环形
}
//取数据
public int getFront() {
if (isEmpty()){
//抛出异常
throw new RuntimeException("队列空,无法读取数据");
}
int Value = arr[front]; //先将数据存入一个临时变量,等会直接返回这个数值
front = (front + 1) % maxSize;
return Value;
}
//显示所有的数据,遍历
public void showQueue() {
if (isEmpty()){
System.out.println("队列空,无法读取数据");
return;
}
for (int i = front; i < front + size(); i++) {
System.out.printf("arr[%d] = %d\n", i % maxSize, arr[i % maxSize]);
}
}
public int size(){
//用到了一个算法,取模的操作,是基本操作,有必要多加注意
//对提升代码水平 和 提高代码简洁度 都很有帮助
//装逼利器
return (rear + maxSize - front) % maxSize;
}
public int headQueue() {
if (isEmpty()){
//抛出异常
throw new RuntimeException("队列空,无法读取数据");
}
return arr[front];
}
}