數據結構之隊列

數據結構之隊列

定義

隊列,是一種先進先出(FIFO, firt in first out)的線性表。隊列的特性是只允許在一端進行插入操作,而在另一端進行刪除操作。允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭。類似于火車站排隊買票的隊列。

隊列分為普通隊列和循環隊列,一般使用循環隊列,因為循環隊列有更高的時間和空間效率。


具體實現


/**
 * 循環隊列實現
 */
public class MyQueue {

    private int[] mData; //隊列存儲內容
    private int mQueueCapacity;  //隊列容量
    private int mQueueLength; //隊列長度
    private int mFront;  //隊頭
    private int mRear;   //隊尾

    public MyQueue(int capacity) {
        this.mQueueCapacity = capacity;
        mData = new int[capacity];
        mQueueLength = 0;
        mFront = 0;
        mRear = 0;
    }

    /**
     * 清空隊列
     */
    public void clearQueue() {
        mQueueLength = 0;
        mFront = 0;
        mRear = 0;
    }

    /**
     * 獲取隊列長度
     * @return
     */
    public int getQueueLength() {
        return mQueueLength;
    }

    /**
     * 隊列是否已滿
     * @return
     */
    public boolean isQueueFull() {
        return mQueueLength == mQueueCapacity;
    }

    /**
     * 隊列是否為空
     * @return
     */
    public boolean isQueueEmpty() {
        return mQueueLength == 0;
    }

    /**
     * 入隊
     * @param element
     * @return
     */
    public boolean enQueue(int element) {
        if (isQueueFull()) {
            return false;
        }
        mData[mRear] = element;
        mRear = (mRear + 1) % mQueueCapacity;
        mQueueLength++;
        return true;
    }

    /**
     * 出隊
     * @return
     */
    public boolean deQueue() {
        if (isQueueEmpty()) {
            return false;
        }
        mFront = (mFront + 1) % mQueueCapacity;
        mQueueLength--;
        return true;
    }

    /**
     * 遍歷隊列
     */
    public void queueTraverse() {
        for (int i = mFront; i < mFront + mQueueLength; i++) {
            int temp = mData[i % mQueueCapacity];
            System.out.println(temp);
        }
    }

    /**
     * 測試
     * @param args
     */
    public static void main(String[] args) {
        MyQueue q = new MyQueue(5);

        q.enQueue(1);
        q.enQueue(2);
        q.enQueue(33);

        q.deQueue();
        q.deQueue();

        q.queueTraverse();

        System.out.println("size = " + q.getQueueLength());

        q.enQueue(4);
        q.enQueue(5);
        q.enQueue(6);

        q.enQueue(7);
        q.enQueue(7);
        q.enQueue(7);

        q.queueTraverse();

        System.out.println("size = " + q.getQueueLength());

        q.clearQueue();
        q.enQueue(666);
        q.queueTraverse();

    }
}

視頻課程:[慕課網]數據結構探險—隊列篇

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 什么是隊列結構: 隊列是允許在一端進行插入操作,而在另一端進行刪除操作的的線性表。隊列是一種先進先出的(First...
    雨飛飛雨閱讀 559評論 0 1
  • 定義 隊列是一種特殊的線性表,特殊之處在于它只允許在表的前端(front)進行刪除操作,而在表的后端(rear)進...
    理想是一盞燈閱讀 837評論 0 1
  • 隊列是一種先進先出的線性表,(FIFO) 限定性的數據結構 雙瑞隊列 雙瑞隊列是限定插入和刪除操作在表的兩端進行的...
    冰鑫925閱讀 355評論 0 0
  • 之前寫了隊列的順序存儲結構,隊列的定義及操作見 數據結構之隊列的順序存儲結構 隊列的鏈式存儲結構與操作實現 隊列接...
    理想是一盞燈閱讀 542評論 0 2
  • 祝賀!今天14時,我國自主研制的新一代噴氣式大型客機C919在上海浦東機場起飛。經過一個多小時的飛行,15點19分...
    三才民俗閱讀 260評論 0 1