隊列

隊列簡介

隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。隊列中沒有元素時,稱為空隊列。

在隊列的形成過程中,可以利用線性鏈表的原理,來生成一個隊列。基於鏈表的隊列,要動態創建和刪除節點,效率較低,但是可以動態增長。隊列採用的 FIFO(first in first out),新元素(等待進入隊列的元素)總是被插入到鏈表的尾部,而讀取的時候總是從鏈表的頭部開始讀取。每次讀取一個元素,釋放一個元素。所謂的動態創建,動態釋放。因而也不存在溢出等問題。由於鏈表由結構體間接而成,遍歷也方便。

隊列實現

下面看一下我們使用 Vec 來實現的簡單 Queue:

主要實現的new( ), push( ), pop( )三個方法

#[derive(Debug)]
struct Queue<T> {
    qdata: Vec<T>,
}

impl <T> Queue<T> {
    fn new() -> Self {
        Queue{qdata: Vec::new()}
    }

    fn push(&mut self, item:T) {
        self.qdata.push(item);
    }

    fn pop(&mut self) -> T{
        self.qdata.remove(0)
    }
}

fn main() {
    let mut q = Queue::new();
    q.push(1);
    q.push(2);
    println!("{:?}", q);
    q.pop();
    println!("{:?}", q);
    q.pop();
}

練習

看起來比我們在上一節實現的Stack簡單多了。不過這個Queue實現是有Bug的。

練習:在這個代碼的上找到 Bug,並修改。

提示:pop( )方法有 Bug,請參考 Stack 小節的實現,利用 Option 來處理。

results matching ""

    No results matching ""