陣列實作佇列 以陣列結構實作佇列的好處是在演算法算很簡單,但跟堆疊不同之處是需要兩種動作:加入與刪除,假設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)... Read more 18 Sep 2023 - 2 minute read
八皇后(Eight Queens) 在西洋棋中的皇后可以在沒有限定一步走幾格的前提下,對棋盤中的其他棋子直吃、橫吃、對角斜吃(左右斜吃),而後放入新皇后,再放入前必須考慮所放位置直線方向、橫線方向或對角線方向是否已被置放舊皇后,否則就會被先放入的舊皇后吃掉。 當在4X4或者8X8的棋盤就變4皇后或8皇后問題。首先當棋盤中置入一個新皇后,且這個位置不會被先前放置的皇后吃掉,就將這個新皇后的位置存入堆疊。 但是放置新皇后的該行的8個位置(以8皇后為例),都沒有辦法放置新皇后(一放入任何一個位置,就會被先前放置的舊皇后吃掉)。必須由堆疊中取出前一個皇后的位置,並於該行或該列中重新尋找另一個新的位置放置,再將該位置存入堆疊中,這就是回朔演算法的應用。 N皇后的解就是配合堆疊及回朔兩種演... Read more 18 Sep 2023 - 0 minute read
河內塔演算法(Tower of Hanoil) 法國數學家Lucas發明了河內塔這個數學問題,典型使用遞迴式與堆疊來解決此問題。古越南某間是廟有三根銀棒(有些故事是木樁),要把某些數量大小不同的圓盤從第一個銀棒移動到第三個。 問題是:假設有A,B,C三個銀棒和n個大小均不相同的圓盤,由小到大編號1,2,3…n,編號越大直徑越大。開始時,n個圓盤是在A銀棒上,要將A銀棒上的圓盤藉著B銀棒當中間橋樑,全部移到C銀棒上最少次的方法,不過在移動時有規則: 直徑較小的圓盤永遠放在直徑較大的圓盤上 圓盤可任意地由任何一個銀棒移到其他銀棒上 每一次僅能移動一個圓盤,而且只能從最上面的圓盤開始移動 我這邊用n=1~3的狀況來走一次... Read more 17 Sep 2023 - 0 minute read
陣列實作堆疊 堆疊和佇列都是屬於抽象資料型態 堆疊結構時常被用來解決問題,例:遞迴呼叫、副程式的呼叫。 佇列在電腦例:計算機模擬、CPU的工作排程。 陣列堆疊 以陣列結構來做堆疊的好處是製作與設計的演算法都很簡單,但因堆疊本身是變動的,則陣列大小並無法事先規劃宣告,太大浪費空間,太小則不夠用。 fn main() { let mut stack: Vec<i32> = Vec::new(); if stack .isempty() { println!("堆疊為空"); } else { println!("堆疊不為空"); } println!("{}", sum); } 範... Read more 16 Sep 2023 - 1 minute read
單向鏈結串列(Singly linked list) 產生一個鏈結的方式,要先制定一個結構資料型態,然後在結構中定義其資料型態。 鏈結串列節點定義 這邊會拿Rust的例子,實現鏈結串例要先連結串列的節點。 struct Node<T> { data: T, next: Option<Bix<Node<T>>> } 這邊定義一個Node節點,data欄位使用了泛型型別T用於鏈結串列點的資料。next使用了Option列舉,如果該節點沒有下一個節點時,next是可空的,因為Rust沒有空值(null,nil),而是提供Option的解決方法,如果該鏈結串咧節點的下個節點為空,則next取值為Option::None。... Read more 14 Sep 2023 - 1 minute read