数组模拟队列 以及队列的复用(环形队列)
使用数组模拟队列
初始化队列
private int front;
指向队列头的第一个元素
privat int maxSzie;
设置队列的最大长度
private int rear;
指向队列尾的最后一个元素的后一个位置,留出一个位置作为约定
因为需要留出一个位置作为约定,那么当数组的maxSize == 4;
的时候有效数据的个数就等于3个
private int[] arr;
使用数组来存储数据,模拟环形队列
那么队列就会形成一个圆环形状的 如下图:
通过分析可以得出front == rear
的时候环形队列是空的
当对列满的时候就是 (rear + 1) % maxSize == front;
队列的有效数据个数(rear + maxSize - front) % maxSize;
队列的有效数据个数就可以用来遍历出整个环形队列的有效值
遍历从front
头指针开始
代码实现:
通过开始判断出来的思路,写代码实现
队列的判空和判满
/**
* 用来判断环形队列是否满的状态
*
* @return
*/
public boolean isFull() {
return (rear + 1) % maxSize == front;
}
/**
* 判断队列是否为空
*
* @return
*/
public boolean isEmpty() {
return rear == front;
}
向环形队列中添加一个元素和取出元素
/**
* 向队列添加一个元素
*
* @param number
*/
public void addQueue(int number) {
if (isFull()) {
System.out.println("队列满,无法加入数据·····");
return;
}
arr[rear] = number;
//将rear后移,向后移动指针的时候必须要考虑取模,不然就会造成数组越界
rear = (rear + 1) % maxSize;
}
/**
* 从队列中取出一个元素
*
* @return
*/
public int getQueue() {
if (isEmpty()) {
new RuntimeException("当前队列为空,不能取出数据");
}
/**
* front 指向队列的第一个元素
* 1、先吧front保存在一个临时变量
* 2、将front后移,后移指针的时候一样必须考虑取模,否则也会造成数组越界
* 3、将临时保存的变量返回
*/
int val = arr[front];
front = (front + 1) % maxSize;
return val;
}
显示队列的所有元素–难点
最重要的是需要计算出来数组中有多少个有效数值
通过思路分析已经得初有效数值的个数(rear + maxSize - front) % maxSize;
这就是数组的有效数据个数
并且数组的第一个元素是从front
开始,那么就需要从front
开始遍历
for(int i = front ; i < front + ((rear + maxSize - front) % maxSize); i++){
//在遍历的时候必须要考虑取模,不然就会数组越界
System.out.printf("arr[%d] = %d\n", i % maxSize, arr[i % maxSize]);
}
具体的代码实现为:
/**
* 显示队列所有元素
*
* @return
*/
public void showQueue() {
if (isEmpty()) {
//当前队列为空,不能取出数据
System.out.println("队列为空,没有数据·····");
return;
}
//思路:从front开始遍历,遍历多少个元素呢
for (int i = front; i < front + size(); i++) {
System.out.printf("arr[%d] = %d\n", i % maxSize, arr[i % maxSize]);
}
}
/**
* 求出当前队列的有效数据的个数
*
* @return
*/
public int size() {
return (rear + maxSize - front) % maxSize;
}
输出队列的第一个元素
因为 front
指向的就是队列头的第一个元素,那么arr[front]
就是第一个元素
/**
* 取出队列头元素
*
* @return
*/
public int headQueue() {
if (isEmpty()) {
new RuntimeException("队列为空,不能取出数据·····");
}
return arr[front];
}
整篇源码查看
gitee:环形队列
github:环形队列