循环队列的实现
队列:大家都懂,就想出排队先进先出麻(别说你还想插队)
循环队列是啥,就是拍一圈咯。但是要有两个指针负责头和尾,不然你都不知道怎么加入,怎么拿走。
(这张图很好诠释了什么是循环队列,恩 ∩_∩)
你需要一个头指针front和一个尾指针rear,头指针指向队列头head,尾指针指向队列尾tail的下一个位置。
if 尾指针下一个位置是队列头时
队列满;
if 尾指针和头指针处于同个位置
队列空
if 队列加入节点
节点变成尾指针
节点下一个位置变成尾指针
if 队列移除节点
头指针下一个位置变成变成头指针
下面的代码时通过数组实现了循环队列
(链表实现循环队列,臣妾现在做不到呀,有空再更╮(╯▽╰)╭)
public class ArrayQueue<E>{
private int head;
private int tail;
private int size;
private E [] arr;
private int DEFAULT_SIZE = 10;
public ArrayQueue() {
clear();
}
private void clear() {
head = 0;
tail = 0;
size = 0;
Arrays.fill(arr,null);
arr = (E[]) new Object[10];
}
public int size(){
if(isEmpty()){
return 0;
}
//后面部分 是当 head 比 tail 小,或者处于同一位置上的做法
return tail > head ? tail - head : size - (head - tail);
}
public boolean isEmpty(){
return head == tail & arr[tail] == null;
}
public boolean isFull(){
return (tail + 1) % DEFAULT_SIZE == head;
}
public boolean add(E e){
if(isFull())
throw new ArrayIndexOutOfBoundsException();
arr[tail++] = e;
//如果尾元素到底,就从0开始计数
if(tail == DEFAULT_SIZE ){
tail = 0;
}
size++;
return true;
}
public E put(){
if(isEmpty())
throw new NullPointerException();
E e = null;
e = arr[head];
arr[head++] = null;
//如果头元素到顶,就从0开始计数
if(head == DEFAULT_SIZE ){
head = 0;
}
size--;
return e;
}
public E peek(){
if(isEmpty())
return null;
return (E) arr[head];
}
}