package com.coding.week8; /** * 用数组实现循环队列 * @author liuxin * * @param <E> */ public class CircleQueue <E> { private final static int DEFAULT_SIZE = 10; //用数组来保存循环队列的元素 private Object[] elementData = new Object[DEFAULT_SIZE] ; private int size; //队头 private int front = 0; //队尾 private int rear = 0; public boolean isEmpty() { return size == 0; } public int size() { return size; } public void enQueue(E data) { if (data == null) { throw new IllegalArgumentException("data can't be null"); } elementData[rear] = data; size++; if ((rear = (rear + 1) % elementData.length) == front) { doubleCapacity(); } } private void doubleCapacity() { int oldCapacity = elementData.length; int newCapacity = oldCapacity << 1; Object[] elementDataNew = new Object[newCapacity]; if (newCapacity < 0) { throw new RuntimeException("capacitity is too big"); } System.arraycopy(elementData, rear, elementDataNew, 0, oldCapacity - rear ); System.arraycopy(elementData, 0, elementDataNew, front, front ); elementData = elementDataNew; front = 0; rear = oldCapacity; } public E deQueue() { if (size == 0) return null; @SuppressWarnings("unchecked") E e = (E)elementData[front]; //let gc work elementData[front] = null; //下标越界处理 front = ++front % elementData.length; size--; return e; } }