08.棧(二)棧的應用,08應用
一、棧的應用-遞迴1.遞迴函式:把一個直接調用自己或通過一系列的調用語句間接地調用自己的函數,稱為遞迴函式。2.棧與遞迴 遞迴函式實際是一個前行和退回的過程,相當與入棧、出棧。在前行階段,對於每一層遞迴,函數的局部變數、參數值以及返回地址都被壓入棧中。在退回階段,位於棧頂的局部變數、參數值和返回地址被彈出(出棧),用於返回調用層次中執行代碼的其餘部分,也就是恢複了調用的狀態。3.遞迴應用-斐波那契數列 斐波那契數列描述的是兔子的繁殖問題,這個數列有個十分明顯的特點:前面相鄰兩項之和,構成了後一項。其數學模型為: | 0,當n=0時,其中n為月個數F(n)=| 1,當n=1時 |F(n-1)+F(n-2),當n>1。其中n為經曆的月個數,F(n)為第n個月時兔子的數量。遞迴實現源碼:
/*斐波那契的遞迴函式*實現列印前40位斐波那契數列 */int Fb(int i) //i為第i個月{ if(i<2) return i==0?0:1; //當n=0、n=1時情況,該月返回的兔子總數=0/1 return Fb(i-1)+Fb(n-2); //當n>1時,第i個月返回的兔子總數}int main(){ int i; for(int i=0;i<40;i++) //依次計算並列印前40個月兔子的數量 { printf("%d",Fb(i)); } return 0;}
二、棧的應用-四則運算運算式求值1.中綴運算式轉換為尾碼運算式(1)目標:中綴運算式"9+(3-1)*3+10/2"轉化為尾碼運算式"9 3 1 - 3 * + 10 2 / +"(2)規則:從左至右遍曆中綴運算式的每個數字和符號。若是數字就輸出,若是符號,則判斷其與棧頂符號的優先順序,是右括弧或優先順序低於棧頂符號,則棧頂元素依次出棧並輸出,並將當前符號進棧,一直到最終輸出尾碼運算式為止。2.尾碼運算式計算結果(1)目標:計算尾碼運算式"9 3 1 - 3 * + 10 2 / +"(2)規則:從左至右遍曆運算式的每個數字和符號,遇到是數字就進棧,遇到是符號,就將處於棧頂兩個數字出棧,進行運算,再將運算結果進棧,一直得到最終結果。總結:將中綴運算式轉換為尾碼運算式關鍵在於-棧用來進出運算的符號將尾碼運算式進行運算的得出結果關鍵在於-棧用來進出運算的數字。