package com.coding.basic.queue;
public class CircleQueue <E> {
private final static int DEFAULT_SIZE = 10;
//用数组来保存循环队列的元素
private Object[] elementData = new Object[DEFAULT_SIZE] ;
//队头
private int front = 0;
//队尾
private int rear = 0;
public boolean isEmpty() {
return front == rear;
}
public int size() {
return rear-front>0?(rear-front):(rear-front+DEFAULT_SIZE);
}
public void enQueue(E data) {
rangeCheck(rear);
elementData[rear] = data;
rear = (rear+1)%DEFAULT_SIZE;
}
@SuppressWarnings("unchecked")
public E deQueue() {
if(isEmpty()){
return null;
}
Object obj = elementData[front];
front = (front+1)%DEFAULT_SIZE;
return (E) obj;
}
/**
* 数组最后一个空间不存放数据<br>
* 用来区分队列的空或者满
* @param rear
*/
private void rangeCheck(int rear) {
if ((rear+1)%DEFAULT_SIZE == front) {
throw new IndexOutOfBoundsException("队列数据已满!");
}
}
@Override
public String toString() {
if(isEmpty()){
return "[]";
}
Object[] temp = new Object[DEFAULT_SIZE];
System.arraycopy(elementData, 0, temp, 0, DEFAULT_SIZE);
int frontTemp = front;
int rearTemp = rear;
StringBuilder str = new StringBuilder();
str.append("[");
while(!isEmpty()){
str.append(this.deQueue().toString()+",");
}
front = frontTemp;
rear = rearTemp;
return str.toString().substring(0, str.length()-1)+"]";
}
}