循环链表
循环队列
注意点:头尾指针的做出了调整,初始全部0,而单向队列为 -1
而且数组中的有一元素被空出来,来表示队列满的情况
class CircleQueneDiy {
//队列的最大长度
private int maxSize;
private int front; //这里和单项队列做出了一个调整,将头指针指向了队列收个元素的地址
private int rear; //尾部的指针也调整为指向队尾元素的后一个地址,我们的队列预留出来了一个长度来判断他是否满了
//队列,模拟队列,来存放数据的
private int[] arr;
//构造器
public CircleQueneDiy(int maxSize) {
this.maxSize = maxSize;
arr = new int[maxSize];
//这里不赋值,因为front 和rear都默认为 0 ,正确
}
//判断队列是否满
public boolean isFull() {
// 解释,我们预留出来一个长度来判断他是否满了,例如当长度为5的数组里面放了4个值的话
// rear就为4, (4+1)%5=0(front) ,而此时没有取过数据 此时,我们就判断这个循环队列 满了
return (rear + 1) % maxSize == front;
}
//判断队列是否为空
public boolean isEmpty() {
return front == rear;
}
//添加数据到队列
public void add(int num) {
//判断是否队列满了
if (isFull()) {
throw new RuntimeException("队列已满");
}
//把数据放在rear下标中
arr[rear] = num;
//改变rear
rear = (rear + 1) % maxSize;
}
//获取数据,出队列
public int get() {
if (isEmpty()) { //如果是空的,就抛异常
throw new RuntimeException("队列中是空的,请添加数据。。。。");
}
//拿出队首的数据
int value = arr[front];
front = (front + 1) % maxSize;
return value;
}
//显示队列所有的数据
public void showQuene() {
//如果是空的
if (isEmpty()) {
throw new RuntimeException("队列中是空的,请添加数据。。。。");
}
for (int i = front; i < front + getSize(); i++) {
System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize]);
}
}
//获取循环队列的有效数据
public Integer getSize() {
return (rear + maxSize - front)%maxSize;
}
//显示队列的头元素,注意不是取出数据
public void showFirst() {
//判空
if (isEmpty()) {
throw new RuntimeException("队列中是空的,请添加数据。。。。");
}
System.out.println(arr[front + 1]);
}
}