package com.coding.basic.queue;
/**
* 用数组实现循环队列
* 没有牺牲一个元素空间,所以判断队空,队满需要取数据验证。
* @author zhaohongxin
*
* @param <E>
*/
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 elementData[front]==null;
}
public int size() {
if (isFull()) {
return DEFAULT_SIZE;
} else if (isEmpty()) {
return 0;
} else if (front < rear) {
return rear - front;
} else {
return rear + DEFAULT_SIZE -front;
}
}
public void enQueue(E data) {
if (isFull()) {
throw new RuntimeException("queue is full");
}
elementData[rear] = data;
if (rear == DEFAULT_SIZE ) {
rear = 0;
} else {
rear++;
}
}
public E deQueue() {
if (isEmpty()) {
throw new RuntimeException("queue is empty");
}
E a = (E) elementData[front];
elementData[front] = null;
if (front == DEFAULT_SIZE ) {
front = 0;
} else {
front++;
}
return a;
}
public boolean isFull() {
return !isEmpty() && front==rear;
}
}