package me.lzb.basic.queue;
/**
* 用数组实现循环队列
* <p>
* Created by LZB on 2017/4/27.
*/
public class CircleQueue<E> {
public CircleQueue(){
DEFAULT_SIZE = 10;
}
public CircleQueue(int size){
if(size <= 0){
size = 10;
}
DEFAULT_SIZE = size;
}
private int DEFAULT_SIZE;
//用数组来保存循环队列的元素
private Object[] elementData = new Object[DEFAULT_SIZE];
//队头
private int front = 0;
//队尾
private int rear = 0;
private int size;
public boolean isEmpty() {
return size() <= 0;
}
public int size() {
return size;
}
public void enQueue(E data) {
nextRear();
elementData[rear] = data;
if (isFull()) {
nextFront();
} else {
size++;
}
}
public E deQueue() {
if (isEmpty()) {
throw new RuntimeException("empty");
}
Object result = elementData[front];
elementData[front] = null;
nextFront();
size--;
return (E) result;
}
private void nextRear() {
if (rear == (elementData.length - 1)) {
rear = 0;
} else {
rear = rear + 1;
}
}
private void nextFront() {
if (front == (elementData.length - 1)) {
front = 0;
} else {
front = front + 1;
}
}
private boolean isFull() {
if (size() == elementData.length) {
return true;
}
return false;
}
@Override
public String toString() {
if (isEmpty()) {
return "[]";
}
StringBuffer sb = new StringBuffer();
sb.append("[");
for (int i = 0; i < elementData.length; i++) {
if (i > 0) {
sb.append(",");
}
sb.append(elementData[i].toString());
}
sb.append("]");
return sb.toString();
}
}