棧的應用:
棧有乙個很重要的應用:在程式語言中實現了遞迴。下面介紹乙個經典的遞迴例子:斐波那契數列。
1,1,2,3,5,8,13,21,34,45,........這樣的數列有很明顯的規律,前兩項和為第三項的值。用數學函式就是這樣的:
如果想列印前40位數字,我們首相想到的就是用迭代法來實現,這裡**就不演示了,而用遞迴就能比迭代更加簡單一些。**如下:
int fun(int i)
return fun(i - 1) + fun(i - 2);
}int mian()
ruturn 0;
}
遞迴的定義:
把乙個直接呼叫自己或者通過一系列的呼叫語句間接地呼叫自己的函式,稱作遞迴函式。每個遞迴定義必須 至少有乙個條件,滿足時不再進行遞迴,即不再引用自身而是返回值退出。
字尾表達法:
舉個例子,9+(3-1)*3+10/2這個表示式用字尾表達法應該是「9 3 1 -3 * + 10 2 / +」。
規則(以上述式子舉例):
1.初始化乙個空棧,此棧用來對應運算的數字進出使用
2.字尾表示式中前三個都是數字,所以9,3,1進棧
3.接下來是「-」,將棧中的1出棧作為減數,3作為被減數,運算得到2,2進棧
4.接著3進棧
5.後面是「*」,所以3,2出棧得到6,6進棧
6.下面是「+」,然後6,9出棧得到15,15進棧
7.接著是10與2進棧
8.然後是符號「/」,所以2,10出棧得到5,5進棧
9.最後乙個符號是「+」,15和5出棧得到20,20進棧
10.最後20出棧,棧為空
那麼怎麼將中綴表示式轉化為字尾表示式呢?
1. 初始化一空棧,用來對符號進出棧使用。
2. 第乙個字元是數字9,輸出9,後面是符號「+」,進棧。
3. 第三個字元是「(」,依然是符號,因其只是左括號,還未配對,故進棧。
4. 第四個字元是數字3,輸出,總表示式為9 3,接著是「-」進棧。
5. 接下來是數字1,輸出,總表示式為9 3 1,後面是符號「)」,此時,我們需要去匹配此前的「(」,所以棧頂依次出棧,並輸出,直到「(」出棧為止。此時左括號上方只有「-」,因此輸出「-」,總的輸出表示式為9 3 1 -
6. 接著是數字3,輸出,總的表示式為9 3 1 - 3 。緊接著是符號「*」,因為此時的棧頂符號為「+」號,優先順序低於「*」,因此不輸出,進棧。
7. 之後是符號「+」,此時當前棧頂元素比這個「+」的優先順序高,因此棧中元素出棧並輸出(沒有比「+」號更低的優先順序,所以全部出棧),總輸出表示式為 9 3 1 - 3 * +.然後將當前這個符號「+」進棧。也就是說,前6張圖的棧底的「+」是指中綴表示式中開頭的9後面那個「+」,而下圖中的棧底(也是棧頂)的「+」是指「9+(3-1)*3+」中的最後乙個「+」。
8. 緊接著數字10,輸出,總表示式變為9 3 1-3 * + 10。
9. 最後乙個數字2,輸出,總的表示式為 9 3 1-3*+ 10 2
10. 因已經到最後,所以將棧中符號全部出棧並輸出。最終輸出的字尾表示式結果為 9 3 1-3*+ 10 2/+
資料結構 棧應用
一 算術表示式的中綴表示 把運算子放在參與運算的兩個運算元中間的算術表示式稱為中綴表示式。例如 2 3 4 6 9 算術表示式中包含了算術運算子和算術量 常量 變數 函式 而運算子之間又存在著優先順序,不能簡單地進行從左到右運算,編譯程式在求值時,不能簡單從左到右運算,必須先算運算級別高的,再算運算...
資料結構 棧的應用
要求 首先將運算元棧opnd設為空棧,而將 作為運算子棧opter的棧底元素,這樣的目的是判斷表示式是否求值完畢 2 依次讀入表示式的每個字元,表示式須以 結尾,若是運算元則入棧opnd,若是運算子,則將此運算子c與opter的棧頂元素top比較優先順序後執行相應的操作,具體操作如下 i 若top的...
資料結構 棧的應用
棧是限制插入和刪除只能在乙個位置上進行的表,該位置是表的末端,也叫做棧頂。對棧的操作有進棧和出棧,進棧也叫做插入,出棧也就是刪除最後插入的元素。因此棧也被稱作lifo 後進先出 表。棧通常有兩種實現方式,陣列實現和鍊錶實現。下面是棧的兩個小應用demo 字串逆序 由於棧後進先出的特性,所以棧可以用於...