隊列(Queue)是一種特殊的線性表,特殊之處在於它只容許在表的前端(front)進行刪除操做,而在表的後端(rear)進行插入操做。隊列的特色就是先進先出(FIFO)。前端
以前咱們在 Java實現單向鏈表 一文中經過鏈表實現了隊列。下面咱們經過數組實現隊列。java
使用數組實現隊列要注意的是,若是隊首和隊尾的指針隨着出隊和入隊變化,會形成隊列的容量變小。後端
下面經過循環隊列的方式,實如今不擴容的狀況下隊列容量恆定:數組
入隊時,隊尾指針位置爲: (rear + 1) % array.length。bash
出隊時,隊頭指針位置爲: (front + 1) % array.length。函數
package net.ijiangtao.tech.algorithms.algorithmall.datastructure.queue.impl;
import java.lang.reflect.Array;
/**
* queue
*
* @author ijiangtao
* @create 2019-07-10 21:06
**/
public class ArrayQueue<T> {
/**
* 隊列容器
*/
private T[] array;
/**
* 隊頭指針
*/
private int front;
/**
* 隊尾指針
*/
private int rear;
/**
* 構造函數
*
* @param capacity 隊列容量
*/
public ArrayQueue(Class<T> type, int capacity) {
//經過反射建立泛型數組
this.array = (T[]) Array.newInstance(type, capacity);
}
public int capacity() {
return array.length;
}
public boolean isFull() {
return (rear + 1) % array.length == front;
}
public boolean isEmpty() {
return rear == front;
}
/**
* 元素入隊
*
* @param element
* @throws Exception
*/
public void enqueue(T element) throws Exception {
if ((rear + 1) % array.length == front) {
throw new Exception("隊列已經滿了");
}
array[rear] = element;
rear = (rear + 1) % array.length;
}
/**
* 元素出隊
*
* @return
* @throws Exception
*/
public T dequeue() throws Exception {
if (rear == front) {
throw new Exception("隊列已經空空如也");
}
T element = array[front];
front = (front + 1) % array.length;
return element;
}
public static void main(String[] args) throws Exception {
ArrayQueue<String> queue = new ArrayQueue<>(String.class, 8);
System.out.println("E1"+queue.capacity());
int i = 1;
while (!queue.isFull()) {
queue.enqueue("E" + (i++));
}
while (!queue.isEmpty()) {
System.out.println(queue.dequeue());
}
}
}
複製代碼
測試方法執行輸出結果以下:post
queue size = 8
E1
E2
E3
E4
E5
E6
E7
複製代碼