1. 程式人生 > >數據結構6 隊列

數據結構6 隊列

保存 data class 轉載 end eth 數據 length ref

上一篇講了棧,這一篇要講的是我們常用的隊列,我會從以下幾個方面進行總結。

1、什麽是隊列
2、隊列的存儲結構
3、隊列的常用操作及實現代碼

1、什麽是隊列

(1)首先,隊列也是一種特殊的線性表,它是一種操作受限的線性表。只允許在表的一端進行元素插入,而在另一端進行元素刪除。允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭。

(2)隊列與現實生活中的排隊類似(如下圖),新加入的成員總是在隊尾,而排在隊列最前面的總是最先離開隊列,即先進先出 First In First Out (FIFO),因此隊列就是先進先出線性表。

技術分享圖片

(3)線性表分為順序表和鏈表,所以隊列也分為順序隊列鏈式隊列,

為了方便演示,下文所使用的隊列都是順序隊列

2、隊列的存儲結構

技術分享圖片

用java語言自己封裝一個順序隊列:

SeqQueue.java

/**
 * 封裝一個順序隊列
 */
public class SeqQueue {
    // 保存數據
    public Object[] data;

    // 頭指針
    public int head;

    // 尾指針
    public int rear;

    // 隊列的最大容量
    public int maxSize;

    public SeqQueue(int maxSize) {
        
this.maxSize = maxSize; data = new Object[maxSize]; } }

3、隊列的常用操作及實現代碼

3-1、初始化隊列

思路:構造一個空隊列,並將頭指針head和尾指針rear都設置為0。

代碼:SeqQueueOperate.java

/**
 * 封裝隊列的常見操作
 */
public class SeqQueueOperate {
    /**
     * 初始化
     *
     * @param maxSize
     * @return
     */
    public
SeqQueue init(int maxSize) { SeqQueue queue = new SeqQueue(maxSize); queue.head = 0; queue.rear = 0; return queue; } }

3-2、入隊

思路:若隊列沒有滿,則將數據插入到尾指針rear指向的位置,然後再將rear加1。

代碼:在 SeqQueueOperate.java 中添加方法

    /**
     * 入隊
     */
    public void enter(SeqQueue queue, Object obj) {
        // 判斷隊列是否已經滿了
        if (queue.rear >= queue.maxSize) {
            return;
        }
        queue.data[queue.rear] = obj;
        queue.rear++;
    }

3-3、出隊

思路:若隊列不為空,則將頭指針指向的元素刪除,然後將頭指針加1。

代碼:在 SeqQueueOperate.java 中添加方法

    /**
     * 出隊
     */
    public Object dequeue(SeqQueue queue) {
        // 判斷隊列是否為空
        if (queue.head == queue.rear) {
            return null;
        }
        Object obj = queue.data[queue.head];
        queue.data[queue.head] = null;
        queue.head++;
        return obj;
    }

3-4、取隊頭

思路:若隊列不為空,則返回隊頭元素。

代碼:在 SeqQueueOperate.java 中添加方法

    /**
     * 取隊頭
     */
    public Object getHead(SeqQueue queue) {
        // 判斷隊列是否為空
        if (queue.head == queue.rear) {
            return null;
        }
        Object obj = queue.data[queue.head];
        return obj;
    }

3-5、取隊長

思路:即尾指針 - 頭指針的值。

代碼:在 SeqQueueOperate.java 中添加方法

    /**
     * 取隊長
     */
    public int getLength(SeqQueue queue) {
        return queue.rear - queue.head;
    }

3-6、判隊空

思路:只需要判斷頭指針和尾指針是否相等即可

代碼:在 SeqQueueOperate.java 中添加方法

    /**
     * 判斷隊列是否為空
     */
    public boolean isEmpty(SeqQueue queue) {
        return queue.head == queue.rear;
    }

3-7、判隊滿

思路:只需判斷尾指針與maxSize是否相等即可

代碼:在 SeqQueueOperate.java 中添加方法

    /**
     * 判斷隊列是否已經滿了
     */
    public boolean isFull(SeqQueue queue) {
        return queue.rear >= queue.maxSize;
    }

4、測試

添加一個用來測試的類

QueueTest.java

/**
 * 用來測試
 */
public class QueueTest {
    public static void main(String[] args) {
        SeqQueueOperate seqQueueOperate = new SeqQueueOperate();
        // 最大容量設置為5
        int maxSize = 5;
        SeqQueue queue = seqQueueOperate.init(maxSize);
        System.out.println("隊列的最大容量是:" + maxSize);

        // 當前隊列的長度
        System.out.println("當前隊列的長度是:" + seqQueueOperate.getLength(queue));
        System.out.println("");

        System.out.println("===========入隊start ===========");
        System.out.println("插入6個元素試試");
        seqQueueOperate.enter(queue, 1);
        seqQueueOperate.enter(queue, 2);
        seqQueueOperate.enter(queue, 3);
        seqQueueOperate.enter(queue, 4);
        seqQueueOperate.enter(queue, 5);
        seqQueueOperate.enter(queue, 6);
        System.out.println("===========入隊end =============");
        // 當前隊列的長度
        System.out.println("當前隊列的長度是:" + seqQueueOperate.getLength(queue));
        System.out.println("");

        // 出隊
        System.out.println("===========出隊start ===========");
        Object obj = seqQueueOperate.dequeue(queue);
        System.out.println("出隊的元素是:" + obj);
        System.out.println("===========出隊end =============");
        // 當前隊列的長度
        System.out.println("當前隊列的長度是:" + seqQueueOperate.getLength(queue));
        System.out.println("");

        System.out.println("------------------------------------");
        System.out.println("隊頭元素是:" + queue.data[queue.head]);
        System.out.println("隊尾元素是:" + queue.data[queue.rear-1]);
    }
}

測試結果:

技術分享圖片

註意:在一個非空的隊列中,頭指針始終指向隊頭元素,而尾指針始終指向隊尾元素的下一個位置

歡迎轉載,但請保留文章原始出處

本文地址:http://www.cnblogs.com/nnngu/p/8277506.html

數據結構6 隊列