iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
Software Development

Easy to learn Algorithm系列 第 20

「Day20」陣列&鏈結串列實作佇列

  • 分享至 

  • xImage
  •  

陣列實作佇列

以陣列結構實作佇列的好處是在演算法算很簡單,但跟堆疊不同之處是需要兩種動作:加入與刪除,假設front指向佇列的前端,rear向佇列的尾端,缺點在於無法事先規劃宣告。

先宣告一個有限容量的陣列

let mut queue: Vec<i32> = vec![0; MAXSIZE]; 
// 使用 Vec 来創建陣列,初始化元素為0

let mut front = -1;
let mut rear = -1;

1.開始時將front與rear都預設為-1,當front=rear時,則為空佇列。

事件說明 front rear Q(0) Q(1) Q(2) Q(3)
空佇列Q -1 -1

2.加入dataA,front=-1,rear=0,每加入一個元素,將rear值加入1:

空佇列Q -1 -1 dataA

3.加入dataB、dataC,front=-1,rear=2:

加入dataB、dataC -1 1 dataA dataB dataC

4.取出dataA,front=0,rear=2,每取出一個元素,將front值加1:

加入dataA 0 2 dataB dataC

5.加入dataD,front=0,rear=3,此時當rear=MAXSIZE-1,表示佇列已滿。

加入dataD 0 3 dataB dataC dataD

6.取出dataB,front=1,rear=3。

加入dataB 1 3 dataC dataD

鏈結串列實作佇列

佇列能以陣列方式來做以外,也可用鏈結串列來做佇列。在宣告佇列類別中,除了和佇列類別中相關的方法外,還必須指向佇列前端以及尾端的指標frontrear

這邊用學生姓名及成績的結構來建立佇列串列:

struct Student {
    name: String,
    score: i32,
}

struct Queue {
    front: Option<Box<Student>>,
    rear: Option<*mut Student>,
}

在佇列中加入新節點,就是加入串列的尾端,刪除節點就是將串列最前端的節點刪除。

// 將學生加到末端
fn enqueue(&mut self, student: Student) {
    let new_node = Box::new(QueueNode {
        student,
        next: None,
    });

    let raw_node = Box::into_raw(new_node);

    if self.is_empty() {
        self.front = Some(unsafe { Box::from_raw(raw_node) });
        self.rear = Some(raw_node);
    } else {
        unsafe {
            (*self.rear.unwrap()).next = Some(Box::from_raw(raw_node));
            self.rear = Some(raw_node);
        }
    }
}



// 將前端的刪除
 fn dequeue(&mut self) -> Option<Student> {
        if self.is_empty() {
            None
        } else {
            let old_front = self.front.take().unwrap();
            let student = old_front.student;
            self.front = old_front.next;
            if self.front.is_none() {
                self.rear = None;
            }
            Some(student)
        }
    }

今天主要是在陣列和鏈結上的應用,資料在佇列裡都是從前和尾來做控制的,這也是跟堆疊的差異性。

目前應該不會太難吧🍳🍳!!

要是哪裡理解上還是邏輯上有錯請各位大大指正,感謝 🧙🧙🧙。


上一篇
「Day19」八皇后
下一篇
「Day21」雙向&優先佇列
系列文
Easy to learn Algorithm30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言