1. 程式人生 > >前輟表示式,中輟表示式,後輟表示式詳解

前輟表示式,中輟表示式,後輟表示式詳解

/*對於科學計算器的演算法運用,有簡單的演算法也有難的演算法,
比如我部落格中的基本功能的演算法程式碼,思維簡單,但是程式碼編寫起來卻是麻煩有難度。
所以牛逼的大神麼就搞出了幾種牛逼的表示式,通過運用資料結構-棧-的優勢,
充分的利用了他的遞迴性,達到了讓人想象不到的高效率及便利性。
所以在這裡給大家說說清楚,以免大家遇到問題時可以非常快的解決。
首先介紹一個概念,叫做中輟表示式
例子:
1+2-3*(4-5)
1+2*(3-4)-5*6
這些生活中,用於數學運算的就是中輟表示式
他可以用二叉樹的形式表現出來。
下圖是第一個式子的二叉樹:*/


/*好,介紹完了簡單的中輟表示式,開始介紹前輟表示式:
所謂的前輟表示式是指將運算子放在運算元的前面。
中輟表示式:1+2-3*(4-5)  ------>>>>>>>>前輟表示式:- + 1 2 * 3 - 4 5
用前輟表示式進行計算的方法,從左開始往右邊讀取:
原理:如果一個操作符後面跟著兩個運算元時,則計算,然後將結果作為運算元替換(這個操作符和兩個運算元),
重複此步驟,直至所有操作符處理完畢。
方法:我們可以用一個棧Sys來實現計算,掃描從右往左進行,如果掃描到運算元,則壓進Sys,如果掃描到操作符,則從Sys彈出兩個運算元進行相應的操作,並將結果壓進Sys(Sys的個數出2個進1個),
當掃描結束後,S2的棧頂就是表示式結果。
同理,後輟表示式:
中輟表示式:1+2-3*(4-5)  ------>>>>>>>>後輟表示式: 1 2 3 4 5 - * - +
我們可以用一個棧Sys來實現計算,掃描從左往右進行,如果掃描到運算元,則壓進Sys,如果掃描到操作符,則從Sys彈出兩個運算元
進行相應的操作,並將結果壓進Sys(Sys的個數出2個進1個),當掃描結束後,Sys的棧頂就是表示式結果。
{
中綴轉字首:對中綴字串String從右向左遍歷。(先前說了,中轉前有兩個棧,一是字元棧一是數字棧)
    1. String[i]為數字,直接輸入數字棧。
    2. String[i]為運算子,與數字棧頂元素進行比較。大於等於棧頂符號優先順序,入字元棧;否則,彈出棧頂符號並將此時的符號插入符號棧。
    3. String[i]為括號。如果為右括號,直接插入符號棧;否則,彈出逐個彈出符號棧中的元素並插入字元棧,直到右括號為止。
    重複以上步驟至字串的尾部,接著彈出數字棧中數字,然後再彈出符號棧的符號。
    即為字首表示式。
}
字尾表示式和字首表示式看起來就像一對逆過程,實際上並不是這樣子,因為字元讀取的時候都是從左往右的,所以,字首表示式往往需要用兩個棧來計算(一般為一個數字棧,一個字元棧),
有時,其中一個棧用來預處理:將字串倒序壓進棧中。另一個直接進行運算處理。
{
	後輟的表示式求法與前輟基本等同。可以自己推演一下(只需要一個棧就可以完成)
}
在資料結構中還可以用一種東西來很好的解釋他,就是二叉樹遍歷方法:前序遍歷,後序遍歷,中序遍歷。
分別對應前輟表示式,中輟表示式,後輟表示式,
前序遍歷=T是要遍歷樹的根指標,中序遍歷要求在訪問根後,遍歷完左子樹後,再遍歷右子樹。
中序遍歷=T是要遍歷樹的根指標,中序遍歷要求在遍歷完左子樹後,訪問根,再遍歷右子樹。
後序遍歷=T是要遍歷樹的根指標,後序遍歷要求在遍歷完左右子樹後,再訪問根。需要判斷根結點的左右子樹是否均遍歷過。



*/