從零開始學資料結構和演算法(三)棧與棧的應用

DevYK發表於2019-03-22

  • 棧是限定僅在表尾進行插入和刪除操作的線性表
  • 允許插入和刪除的一端稱為棧頂(top),另一端稱為棧底(bottom),不含任何資料元素的棧稱為空棧。棧又稱為後進先出的線性表

g.jpg

棧的實現

  • 順序方式

g2.jpg

  • Stack.java 原始碼
    • 參考 D:\Android\學無止境\隨記\SchemaLearningRecords\原始碼分析\java\Stack 原始碼分析.md

遞迴基礎

程式呼叫自身的程式設計技巧稱為遞迴(recursion)。 遞迴做為一種演算法在程式設計語言中廣泛應用。 一個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法, 它通常把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解, 遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的程式碼量。 遞迴的能力在於用有限的語句來定義物件的無限集合。 一般來說,遞迴需要有邊界條件、遞迴前進段和遞迴返回段。 當邊界條件不滿足時,遞迴前進;當邊界條件滿足時,遞迴返回。

執行特點

''' fun( 3 ) '''

dgzxtd.jpg

經典遞迴演算法 - 漢羅塔演算法

需求:

​ A 放入 N 個盤子,並且盤子在柱子中從大到小依次向上小盤子不能在大盤子上,求把 A 中的盤子移到 C 中最少移動幾次,如何移動。注意每次只能一個 。

分析:

​ 漢諾塔問題就是把A柱上的N-1個盤子經過C移動到B,再把A上的最大的盤子移到C,而B上的N-1再類似上述步驟遞迴迴圈移到C上。

動畫演示:

hlt.gif

上程式碼:

  private void move(String a,String c){
        System.out.println("從" + a + "到" + c);
    }

public void hanoi(int n ,String a,String b,String c){
    if(n == 1){
        move(a,c);
    }else{
        hanoi(n-1,a,c,b);
        move(a,c);
        hanoi(n-1,b,a,c);
    }
}
複製程式碼

呼叫自己一次的情況

  • 呼叫位置前面的程式碼是正迴圈,呼叫位置後面的程式碼是反迴圈

呼叫自己二次的情況

  • 他是一個二叉樹的中序遍歷過程

相關文章