從零開始學數據結構和算法(三)棧與棧的應用

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

g.jpg

棧的實現

  • 順序方式

g2.jpg

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

遞歸基礎

程序調用自身的編程技巧稱爲遞歸(recursion)。 遞歸作爲一種算法在程序設計語言中普遍應用。 一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法, 它一般把一個大型複雜的問題層層轉化爲一個與原問題類似的規模較小的問題來求解, 遞歸策略只需少許的程序就可描述出解題過程所須要的屢次重複計算,大大地減小了程序的代碼量。 遞歸的能力在於用有限的語句來定義對象的無限集合。 通常來講,遞歸須要有邊界條件、遞歸前進段和遞歸返回段。 當邊界條件不知足時,遞歸前進;當邊界條件知足時,遞歸返回。java

執行特色

''' fun( 3 ) '''算法

dgzxtd.jpg

經典遞歸算法 - 漢羅塔算法

需求:編程

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

分析:源碼分析

​ 漢諾塔問題就是把A柱上的N-1個盤子通過C移動到B,再把A上的最大的盤子移到C,而B上的N-1再相似上述步驟遞歸循環移到C上。動畫

動畫演示:spa

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);
    }
}
複製代碼

調用本身一次的狀況

  • 調用位置前面的代碼是正循環,調用位置後面的代碼是反循環

調用本身二次的狀況

  • 他是一個二叉樹的中序遍歷過程
相關文章
相關標籤/搜索