package com.coding.basic.queue;
import java.util.NoSuchElementException;
/**
* 用数组实现循环队列
* @author liuxin
*
* @param <E>
*/
public class CircleQueue <E> {
private final static int DEFAULT_SIZE = 10;
private final static int INCREAMENT_SIZE = 5;
//用数组来保存循环队列的元素
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 ? rear-front : elementData.length - (front-rear);
}
public void enQueue(E data) {
//empty
if(this.isEmpty()){
elementData[front] = data;
rear++;
return;
}
//oversize enlarge elementData
if(this.size() == elementData.length){
Object[] newElementData = new Object[elementData.length + INCREAMENT_SIZE];
int index = 0;
for(int i = front ; i==rear; i++){
if(i == this.size()-1){
i = 0 ;
}
newElementData[index++] = elementData[i];
}
elementData = newElementData;
}else{
if(rear == elementData.length-1){
rear = 0;
}else{
rear++;
}
elementData[rear] = data;
}
}
public E deQueue() {
if (isEmpty()) {
throw new NoSuchElementException("Queue underflow");
}
//rear is the first element
if(rear == 0 ){
E data = (E)elementData[rear];
rear = elementData.length -1 ;
return data ;
}else {
return (E)elementData[rear--];
}
}
}