讲真,这个东西有点绕.沉下心看,然后自己手动实现代码,一点一点摸索.图自己画的,学习的过程中也可以自己画个图,比较简单的,只要你去做
环形队列
什么是环形队列
简言之就是我们平时的排队,那个就是环形队列.虽然看着不是环形的,但是模拟成问题就是一个环形队列的问题.
如下图示例
图示已经很清楚了,这里就不在进行解释了.
代码实现
package name.dancer.array;
import java.io.Serializable;
/**
* 环形队列
* @author dancer
* @date 2019-07-19
* @description
* 釜山行看过没?躲过了六节车厢的丧尸,却躲不过一节车厢的人心,所以证明了
* -- 一节更比六节强
**/
public class RingArrayQuere<E> implements Serializable {
private static final long serialVersionUID = -4396411833336571619L;
/**
* 队首
*/
private int front;
/**
* 队尾
*/
private int rear;
/**
* 容器大小
*/
private int size;
/**
* 容器
*/
private Object[] elementData;
public RingArrayQuere(int size) {
this.size = size + 1;
elementData = new Object[this.size];
}
/**
* 添加元素到对垒
* @param e 要添加到队列中的元素
* @return boolean
*/
public boolean add(E e) {
if (isFull()) {
System.out.println("队列已满!");
return false;
}
elementData[rear] = e;
rear = (rear + 1) % size;
return true;
}
/**
* 获取队首的元素
* @return e 队列中队首的元素
*/
@SuppressWarnings("unchecked")
public E get() {
// 判断队列是否为空
if (isEmpty()) {
throw new RuntimeException("队列為空!");
}
E temp = (E) elementData[front];
front = (front + 1) % size;
return temp;
}
/**
* 获取当前队列的有效元素个数
* @return 有效元素个数
*/
public int effictiveDataSize() {
return (rear + size - front) % size;
}
/**
* 判断队列是否为空
* @return boolean
*/
private boolean isEmpty() {
return rear == front;
}
/**
* 判断队列是否满
* @return boolean
*/
private boolean isFull() {
return (rear + 1) % size == front;
}
public static void main(String[] args) {
RingArrayQuere<Integer> list = new RingArrayQuere<>(4);
list.add(1);
list.add(2);
list.add(3);
list.add(4);
System.out.println(list.get());
System.out.println(list.get());
System.out.println(list.get());
System.out.println(list.get());
list.add(5);
list.add(6);
System.out.println(list.effictiveDataSize());
}
}