算法與數據結構-隊列-使用數組實現循環隊列

使用數組實現循環隊列

什麼是隊列

隊列(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
複製代碼
相關文章
相關標籤/搜索