棧和佇列(二) 棧的應用舉例

2021-06-07 06:11:40 字數 2600 閱讀 1706

一、數制轉換

十進位制數n和其它d進製數的轉換是計算機實現計算的基本問題,其解決方法很多,其中乙個簡單的演算法是基於下列原理:

n = (n div d) * d + n mod d。其中:div為整除運算,mod為求餘運算。

例:(1348)10 = (2504)8,其運算過程如下:

n    n div 8    n mod 8

1348    168        4

168      21               0

21           2        5

2           0            2  

從上述運算過程可見:①從低位到高位順序產生八進位制數的各個位數;②與列印輸出由高位到低位的順序相反。

因此,將計算過程中得到的八進位制數的各位順序進棧,再按出棧序列列印輸出,即可得到與輸入對應的八進位制數。

二、括號匹配的檢驗

假設表示式中允許包含兩種括號:圓括號和方括號,其巢狀的順序隨意,即(())或[()]等均為正確的格式,[(])或([())均為不正確的格式。

檢驗括號是否匹配的方法:運用「期待的急迫程度」的概念。

例:考慮下列括號序列

1  2  3   4  5   6   7     8

分析:1.計算機接受第1個括號後,期待與之匹配的第8個括號出現。

2.獲得第2個括號,此時第1個括號暫時放在一邊,而急迫期待與之匹配的第7個括號出現。

3.獲取第3個括號,此時又把第2個括號暫時放在一邊,而急迫期待與之匹配的第4個括號出現,第3個括號的期待得到滿足,消解之後,第2個括號的期待匹配又成為當前最急迫的任務了。

4.以此類推,可見,該處理過程與棧的特點吻合。

演算法的思路:1.設定乙個棧,順序讀入括號。

2.若是右括號,則或者使置於棧頂的最急迫期待得以消解,或則是不合法的情況。

3.若是左括號,則作為乙個新的最急迫的期待壓入棧中,自然使原有在棧中所有未消解的期待的急迫性降了一級。

說明:在此演算法的開始和結束時,棧都應該是空的。

三、迷宮求解

計算機解迷宮的方法:「窮舉求解」法,即從入口出發,順某一方向向前探索,若能走通,則繼續網前走,否則沿原路退回,換乙個方向再繼續探索,直到所有的通路都探索到為止。如下圖為一迷宮

求一條路徑演算法的基本思想:假設以棧s記錄當前路徑,則棧頂中存放的是「當前路徑上最後乙個通道塊」:

1.若當前路徑可通,則納入「當前路徑」——當前位置入棧操作,並繼續朝下乙個位置「探索」,即切換下一位置為當前位置,如此重複直至到達出口。

2.若當前位置不可通,則應該順著「來向」退回到前一通道塊,然後朝著除來向之外的其他方向繼續探索。

3.若該通道的4個方向均不可通,則應該從「當前路徑」上刪除該通道塊——出棧操作。 

四、hanoi塔問題

n階hanoi塔問題。假設有3個分別命名為x,y,z的塔座,在塔座x上插有n個直徑大小不同、依小到大編號為1,2,……,n的圓盤,如下圖。現要求將x軸上的n個圓盤移到z上並仍按同樣的順序疊排,圓座移動必須遵循下列規則:

(1)每次只能移動乙個圓盤。

(2)圓盤可以插在x,y,z中的任一塔座上。

(3)任何時刻都不能將乙個教大的圓盤壓在較小的圓盤之上。

解決方法:

當n = 1時,直接把圓盤從x移到z。

當n > 1時,先把上面的n-1個圓盤從x移到y,然後將n號盤從x移到z,再將n-1個盤從y移到z。

即把求解n個圓盤的hanoi問題轉化為求解n-1 個圓盤的hanoi問題,依次類推,直到轉化成只有乙個圓盤的hanoi問題。

執**況:遞迴工作棧儲存內容:形參n,x,y,z。**如下

void

move(

char

x, char

y)-->

", x, y));

console.writeline();

}void

hanoi(

intn, 

char

one, 

char

two, 

char

three)}

注:該演算法通過遞迴實現,棧在遞迴演算法的內部中所起到的什麼樣的作用呢?

①呼叫函式時:系統將會為呼叫者構造乙個由參數列和返回位址組成的活動記錄,並將其壓入到由系統提供的執行時刻棧的棧頂,然後將程式的控制權轉移到被調函式。若被調函式有區域性變數,則在執行時刻棧的棧頂也要為其分配相應的空間。因此,活動記錄和這些區域性變數形成了乙個可供被調函式使用的活動結構。

注意:參數列的內容為實參,返回位址是函式呼叫語句的下一指令的位置。

②被調函式執行完畢時:系統將執行時刻棧棧頂的活動結構退棧,並根據退棧的活動結構中所儲存的返回位址將程式的控制權轉移給呼叫者繼續執行。

棧的應用舉例

一 目的 掌握棧的表示,實現及其針對棧的各種操作進行具體的應用。二 要求 1 建立乙個順序棧,實現括號配對,判斷乙個表示式中括號配對是否合法。2 當使用者輸入乙個合法的表示式後,能夠返回正確的結果。能夠計算的運算子包括 加 減 乘 除 括號 能夠計算的數要求在實數範圍內。對於異常表示式給出錯誤提示。...

棧的應用舉例

十進位制數n和其他d進製數的轉換是計算機實現計算的基本問題,其解決方法很多,其中乙個簡單演算法基於下列原理 n n div d d n mod d 其中 div為整除運算,mod為求餘運算 例如,2007 10 3727 8,其運算過程如下 可以看到上述過程是從低位到高位產生8進製的各個數字,然後從...

棧的java實現和棧的應用舉例

例子和習題出自資料結構 嚴蔚敏版 棧的實現 棧是一種先進後出的資料結構,首先定義了棧需要實現的介面 public inte ce mystack棧的陣列實現,底層使用陣列 public class myarraystackimplements mystack override public void...