/**
* 使用数组模拟环形队列
* 思路:队列的头部front指向队列的第一个位置,默认值为0
* 队列的尾部指向了队列的最后一个位置+1(也就是数组的位置)。默认值为0,将数组的一个位置预留出来
*/
public class RingQueue {
//数组的大小,也就是队列大小-1,减了一个预留位置,比如maxSize为4,表示数组的大小为4,但是队列的大小为3,因为预留了一个位置
private int maxSize;
private int front;
private int rear;
private int[] ringQueue;
//初始化环形队列的方法
public RingQueue(int maxSize) {
this.maxSize = maxSize;
ringQueue = new int[maxSize];
//头部尾部默认值为0
front = 0;
rear = 0;
}
//判断队列是否满了的方法
public boolean isFull() {
//因为环形队列的尾部指向了队列的最后一个位置的后一个位置,当rear=3,front=0时,其实队列已经满了,但是数组有一个预留位置,所以rear+1才是满了的
return (rear + 1) % maxSize == front;
}
//判断队列是否为空
public boolean isEmpty() {
return rear == front;
}
//增加一个数据
public void addData(int data) {
//判断是否满了
if (isFull()) {
throw new RuntimeException("队列满了!");
}
//因为环形队列的尾部指向了最后一个数据的后一个位置,所以不需要先++
ringQueue[rear] = data;
//尾部先++之后再除余
rear = (rear + 1) % maxSize;
//当尾部为0时,我们加入一个数据,不需要先++,此时的0号位置加入,然后再++,为了防止rear超过了maxSize,所以我们要取余
}
//取出一个数据
public int getData() {
//先判断是否为空
if (isEmpty()) {
throw new RuntimeException("队列为空!");
}
int temp = ringQueue[front];
front = (front + 1) % maxSize;
System.out.println("取出的数据为" + temp);
return temp;
}
//求出当前队列的个数
public int getCount() {
return ((rear + maxSize - front) % maxSize);
}
//展示所有数据
public void showQueue() {
//判断是否为空
if (isEmpty()) {
throw new RuntimeException("队列为空!");
}
System.out.println("=====数据展示=====");
//我们要从front开始遍历,一直到数据的总个数
System.out.println("数据的个数为:" + getCount());
for (int i = front; i < front + getCount(); i++) {
System.out.println("========"+ringQueue[i % maxSize] + "========");
}
}
}
测试类
public class Test {
public static void main(String[] args) {
//设置队列的大小为3,因为有一个预留位置
RingQueue queue = new RingQueue(4);
queue.addData(1);
queue.addData(2);
queue.addData(3);
queue.getData();
queue.getData();
queue.addData(4);
queue.getData();
queue.addData(5);
queue.showQueue();
}
}