棧的應用 遞迴與四則運算表示式求值

2021-07-14 15:07:19 字數 2468 閱讀 9363

將乙個直接呼叫自己或通過一系列的呼叫語句間接的呼叫自己的函式,稱為遞迴函式

每個遞迴定義必須至少有乙個條件,滿足是遞迴將不再進行,即不再引起自身而是返回值退出。(即必須要有遞迴結束的條件,以數值返回就不再呼叫函式)

例子–斐波那契數列
q:若兔子在出生兩個月後,就有繁殖能力,一對兔子每個月能生出一對兔子。假設所有兔子都不死,那麼一年以後可以繁殖多少對兔子呢?

分析: 第乙個月–1對 ; 第二個月–1對 ; 第三個月–2對 ; 第四個月–3對 ; 第五個月–5對 ; 第六個月–8對 ……

斐波那契數列用數學函式來表示:f0

=0,f

1=1,

fn=f

n−1+

fn−2

(n>1)

下面先使用常規的迭代方法實現斐波那契數列:

int main()

return

0;}

接下來使用遞迴方法來實現(簡單乾淨):

/*斐波那契數列的遞迴實現*/

int fbi(int i)

int main()

小結
迭代使用的是迴圈結構,而遞迴使用的是選擇結構。遞迴會讓**的結構簡單、清晰,但是大量的遞迴呼叫會建立函式的副本,耗費大量的時間和記憶體。視情況選擇實現方法。

遞迴和棧的關係:遞迴過程中退回的順序是它前行順序的逆序,編譯器使用棧來實現遞迴操作。當然現在很多高階語言已經系統封裝了遞迴,可直接使用。

了解–字尾(逆波蘭)表示式法

之前也已經有根據括號匹配來完成四則運算,但是還不夠,除了括號還要考慮到四則運算的先後順序,先乘除後加減,所以,後來提出一種不需要括號字尾表達法,也被稱為逆波蘭表示—–所有的符號都要在運算數字的後面出現。

中綴表示式–字尾表示式法

將中綴表示式「9+(3-1)3+10/2」轉化為字尾表示式「9 3 1 - 3*+10 2 / +」。

規則:從左到右遍歷中綴表示式的每個數字和符號,若是數字輸出,即成為字尾表示式的一部分;若是符號,則判斷其與棧頂元素符號的優先順序,是右括號或優先順序不高於棧頂符號(乘除優先加減),則棧頂元素依次出棧並輸出,並將當前符號進棧,一直到最終輸出字尾表示式為止。

步驟:

1. 初始化空棧,用於符號的進出棧使用;

2. 首先是數字9,輸出9;後面是符號「+」,進棧;

3. 第三個符號是(,符號,還未配對,所以進棧;接下來是數字3,輸出;

4. 接下來是符號「–」,因前面是左括號,遇到右括號才出棧,所以,入棧;

5. 數字1,輸出;遇到右括號「)」,彈出左括號上方的所有符號,所以」–」出棧;

6. 符號」*」,比「+」的優先順序高,所以入棧;數字3,輸出,這時輸出為9 3 1 – 3;

7. 符號」+」,不高於」*」和「+」符號,所以兩個符號都彈出,然後將「+」進棧;

8. 數字10,輸出;」/」的優先順序高於「+」,所以入棧,此時輸出為9 3 1 – 3 * + 10;

9. 數字2,輸出;到了表示式末尾,所有符號彈棧,最後輸出 9 3 1 – 3 * + 10 2 / +。

字尾表示式法計算結果

字尾表示式「9 3 1 - 3**+10 2 / +」,計算其最終結果。

規則:從左到右遍歷表示式的每個數字和符號,遇到數字就進棧,暈倒是符號,就將處於棧頂兩個元素出棧,進行運算,運算結果進棧,一直到最終獲得結果。

步驟:

1. 初始化空棧,用於表示式中數字的進出棧使用;

2. 首先是數字9,3,1,進棧;遇到『–』號,將數字1和3彈出棧,3-1 運算完成,將數字2入棧;

3. 數字3,入棧;遇到『*』號,將數字3和2彈出棧,2*3運算完成後,將6壓入棧;

4. 接下來,符號『+』,將數字6和9彈出棧,9+6運算完成後,將15壓入棧;

5. 數字10和2,入棧;符號『/』,將2和10彈出棧,10/2運算完成後,將5入棧;

6. 符號『+』,將數字5和15彈出棧,15+5運算完成後,將20壓入棧;

7. 表示式結尾,將結果20彈出棧,棧為空。

小結

棧 四則運算表示式實現

棧的乙個常見應用,四則運算表示式求值。主要有兩個步驟 1,中綴轉字尾 2,字尾求值 實現起來比較簡單,我通過c 的容器stack實現一遍。從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,即稱為字尾表示式的一部分,若是符號,則判斷其與棧頂符號的優先順序,是右括號或優先順序低於棧頂符號 乘除優先...

四則運算表示式求值(棧的應用)

1.前 中 字尾表示式的轉換 首先需要明白三者之間的轉換 自然表示式轉換為前 中 字尾表示式,其實是很簡單的。首先將自然表示式按照優先順序順序,構造出與表示式相對應的二叉樹,然後對二叉樹進行前 中 字尾遍歷,即得到前 中 字尾表示式。舉例說明將自然表示式轉換成二叉樹 a b c d 根據表示式的優先...

棧的應用 四則運算表示式求值

1 字尾表示法定義 所有的符號都是在要運算數字的後面出現。如 9 3 1 3 10 2的字尾表示法應該是9 3 1 3 10 2 2 字尾表示式計算結果 規則 從左到右遍歷表示式的每個數字和符號,遇到數字就進棧,遇到是符號,就將處於棧頂的兩個數字出棧,進行運算,運算結果進棧,一直到最終獲得結果。以9...