package com.coding.basic.queue; /** * 用数组实现循环队列 * * @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; public boolean isEmpty() { return rear == front && elementData[rear] == null; } public int size() { if (isEmpty()) { return 0; } return rear > front ? rear - front : DEFAULT_SIZE - (front - rear); } public void enQueue(E data) { if (rear == front && elementData[front] != null) { throw new IndexOutOfBoundsException("队列已满的异常"); } elementData[rear++] = data; // 如果rear已经到头,那就转头 rear = rear == DEFAULT_SIZE ? 0 : rear; } @SuppressWarnings("unchecked") public E deQueue() { if (isEmpty()) { throw new IndexOutOfBoundsException("空队列异常"); } // 保留队列的rear端的元素的值 E oldValue = (E) elementData[front]; // 释放队列的rear端的元素 elementData[front++] = null; // 如果front已经到头,那就转头 front = front == DEFAULT_SIZE ? 0 : front; return oldValue; } public String toString() { if (isEmpty()) { return "[]"; } else { // 如果front < rear,有效元素就是front到rear之间的元素 if (front < rear) { StringBuilder sb = new StringBuilder("["); for (int i = front; i < rear; i++) { sb.append(elementData[i].toString() + ", "); } int len = sb.length(); return sb.delete(len - 2, len).append("]").toString(); } // 如果front >= rear,有效元素为front->capacity之间、0->front之间的 else { StringBuilder sb = new StringBuilder("["); for (int i = front; i < DEFAULT_SIZE; i++) { sb.append(elementData[i].toString() + ", "); } for (int i = 0; i < rear; i++) { sb.append(elementData[i].toString() + ", "); } int len = sb.length(); return sb.delete(len - 2, len).append("]").toString(); } } } }