棧的應用 解析算術表示式

2021-07-22 14:51:18 字數 2356 閱讀 6241

對計算機的演算法來說,直接求算術表示式的值是相當困難的,一般分兩步實現演算法會更容易:

將算術表示式轉換成另一種形式。

計算字尾表示式的值。

第一步比較難,但第二步很簡單。對計算機來說,這種分兩步的演算法比直接解析演算法容易的多。

中綴表示式是一種通用的算術或邏輯公式表示方法,操作符以中綴形式處於運算元的中間。中綴表示式是人們常用的算術表示方法。

雖然人的大腦很容易理解與分析中綴表示式,但對計算機來說中綴表示式卻是很複雜的,因此計算表示式的值時,通常需要先將中綴表示式轉換為字首或字尾表示式,然後再進行求值。對計算機來說,計算字首或字尾表示式的值非常簡單。

字首表示式就是不含括號的算術表示式,而且它是將運算子寫在前面,運算元寫在後面的表示式,為紀念其發明者波蘭數學家jan lukasiewicz也稱為"波蘭式"。例如,- 1 + 2 3,它等價於1-(2+3)。

對於乙個字首表示式的求值而言,首先要從右至左掃瞄表示式,從右邊第乙個字元開始判斷,如果當前字元是數字則一直到數字串的末尾再記錄下來,如果是運算子,則將右邊離得最近的兩個「數字串」作相應的運算,以此作為乙個新的「數字串」並記錄下來。一直掃瞄到表示式的最左端時,最後運算的值也就是表示式的值。例如,字首表示式「- 1 + 2 3「的求值,掃瞄到3時,記錄下這個數字串,掃瞄到2時,記錄下這個數字串,當掃瞄到+時,將+右移做相鄰兩數字串的運算子,記為2+3,結果為5,記錄下這個新數字串,並繼續向左掃瞄,掃瞄到1時,記錄下這個數字串,掃瞄到-時,將-右移做相鄰兩數字串的運算子,記為1-5,結果為-4,所以表示式的值為-4。

字首表示式是一種十分有用的表示式,它將中綴表示式轉換為可以依靠簡單的操作就能得到運算結果的表示式。例如,(a+b)*(c+d)轉換為*,+,a,b,+,c,d。它的優勢在於只用兩種簡單的操作,入棧和出棧就可以解決任何中綴表示式的運算。其運算方式為:如果當前字元(或字串)為數字或變數,則壓入棧內;如果是運算子,則將棧頂兩個元素彈出棧外並作相應運算,再將結果壓入棧內。當字首表示式掃瞄結束時,棧裡的就是中綴表示式運算的最終結果。

相關例子

a+b ---> +,a,b

a+(b-c) ---> +,a,-,b,c

a+(b-c)*d ---> +,a,*,-,b,c,d

a=1+3 ---> =,a,+,1,3

(1) 首先構造乙個運算子棧

s1(也可放置括號),運算子(以括號分界點)在棧內

遵循越往棧頂優先順序不降低的原則

進行排列,

再構造乙個儲存中間結果的棧s2;

(2) 從右至左掃瞄中綴表示式;

(3) 遇到運算元時,將其壓入s2;

(4) 遇到運算子時,比較其與s1棧頂運算子的優先順序:

(4-1) 如果s1為空,或棧頂運算子為右括號「)」,則直接將此運算子入棧;

(4-2) 否則,若優先順序比棧頂運算子的較高或相等,也將運算子壓入s1;

(4-3) 否則,將s1棧頂的運算子彈出並壓入到s2中,再次轉到(4-1)與s1中新的棧頂運算子相比較;

(5) 遇到括號時:

(5-1) 如果是右括號「)」,則直接壓入s1;

(5-2) 如果是左括號「(」,則依次彈出s1棧頂的運算子,並壓入s2,直到遇到右括號為止,此時將這一對括號丟棄;

(6) 重複步驟(2)至(5),直到表示式的最左邊;

(7) 將s1中剩餘的運算子依次彈出並壓入s2;

(8) 依次彈出s2中的元素並輸出,結果即為中綴表示式對應的字首表示式。

字尾表達法

在字尾表達法中,操作符跟在兩個運算元的後面,這樣,a+b就成為ab+,a/b成為ab/。字尾表示式中也稱作波蘭逆序表示式(

reverse 

polish 

notation 

),或者rpn,它是由一位波蘭的數學家發明的。更複雜的中綴表示式同樣可以轉換成字尾表示式,比如: 

字尾表示式:9 3 1-3*+ 10 2/+

計算中綴表示式的值

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

將中綴表示式轉換為字尾表示式的演算法思想:

運算子(以括號分界點)在棧內

遵循往棧頂優先順序

公升高的原則

進行排列

1·開始掃瞄;

2·數字時,加入字尾表示式;

3·運算子:人

a. 若為 '(',入棧;

b. 若為 ')',則依次把棧中的的運算子加入字尾表示式中,直到出現'(',從棧中刪除'(' ;

c. 若為 除括號外的其他運算子, 當其優先順序高於除'('以外的棧頂運算子時,直接入棧。否則從棧頂開始,依次彈出比當前處理的運算子優先順序高和優先順序相等的運算子,直到乙個比它優先順序低的或者遇到了乙個左括號為止。

4·當掃瞄的中綴表示式結束時,棧中的的所有運算子出棧;

利用棧解析算術表示式

在沒有接觸到棧這種資料結構時,一直覺得用程式計算四則表示式是件相當繁瑣的事。但利用棧,問題就立刻變得容易許多。解析任何包括 和0到9數字組成的算術表示式,並計算其結果。中綴表示式就是通常所說的算術表示式,比如 1 2 3 4。字尾表示式是指通過解析後,運算子在運算數之後的表示式,比如上式解析成字尾表...

棧的應用 算術表示式求值

選擇棧作為資料結構,所以所有操作都要圍繞棧的特點來進行。因為先入棧而被壓在下面的意味著要後處理,所以優先順序低的不能壓著優先順序高的而入棧。對於同級的操作符,因為要按照從左往右的運算規則,所以也不 能壓著同級的操作符而入棧。簡單來說,與棧頂的操作符比較,優先順序高的則入棧,否則操作符出棧作相應運 算...

算術表示式求值 棧的應用

注 實驗用書為 資料結構 c語言版 第2版,人民郵電出版社出版。實驗題目 學生管理系統的設計與實現 實驗環境 visual c 6.0或其他c 環境 一 實驗目的 1 掌握棧的定義及實現 2 掌握利用棧求解算術表示式的方法。二 實驗內容 通過修改完善教材中的演算法3.4,利用棧來實現算術表示式求值的...