package com.github.HarryHook.coding2017.queue;
import java.util.NoSuchElementException;
/**
* 用数组实现循环队列
*
* @author liuxin
*
* @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;
// 队内元素个数
private int size = 0;
public boolean isEmpty() {
if(rear == front) { //但不一定为0
return true;
}
return false;
}
public int size() {
return size;
}
public void enQueue(E data) {
if((rear + 1) % DEFAULT_SIZE != front) { //队列未满
elementData[rear] = data;
rear = (rear + 1) % DEFAULT_SIZE;
size++;
}
}
public E deQueue() {
if (isEmpty()) {
throw new NoSuchElementException("Queue underflow");
}
E data = (E) elementData[front];
front = (front + 1) % DEFAULT_SIZE;
size--;
return data;
}
public static void main(String[] args) {
CircleQueue<Integer> queue = new CircleQueue<>();
queue.enQueue(1);
queue.enQueue(1);
queue.enQueue(2);
queue.enQueue(3);
queue.enQueue(1);
queue.enQueue(1);
queue.enQueue(2);
queue.enQueue(3);
queue.enQueue(1);
queue.enQueue(1);
queue.enQueue(2);
queue.enQueue(3);
System.out.println("queue.deQueue()= " + queue.deQueue());
System.out.println("queue.deQueue()= " + queue.deQueue());
System.out.println("queue.deQueue()= " + queue.deQueue());
System.out.println("queue.deQueue()= " + queue.deQueue());
System.out.println("queue.size= " + queue.size());
queue.enQueue(3);
queue.enQueue(3);
queue.enQueue(1);
queue.enQueue(1);
queue.enQueue(2);
System.out.println("queue.rear= " + queue.rear);
System.out.println("queue.front= " + queue.front);
}
}