算術表達式的前綴,中綴,后綴相互轉換


原博客地址:https://blog.csdn.net/smartab/article/details/81215940

中綴表達式(中綴記法)
中綴表達式是一種通用的算術或邏輯公式表示方法,操作符以中綴形式處於操作數的中間。中綴表達式是人們常用的算術表示方法。
雖然人的大腦很容易理解與分析中綴表達式,但對計算機來說中綴表達式卻是很復雜的,因此計算表達式的值時,通常需要先將中綴表達式轉換為前綴或后綴表達式,然后再進行求值。對計算機來說,計算前綴或后綴表達式的值非常簡單。

前綴表達式(前綴記法、波蘭式)
前綴表達式的運算符位於操作數之前。

前綴表達式的計算機求值:
從右至左掃描表達式,遇到數字時,將數字壓入堆棧,遇到運算符時,彈出棧頂的兩個數,用運算符對它們做相應的計算(棧頂元素 op 次頂元素),並將結果入棧;重復上述過程直到表達式最左端,最后運算得出的值即為表達式的結果。
例如前綴表達式“- × + 3 4 5 6”:
(1) 從右至左掃描,將6、5、4、3壓入堆棧;
(2) 遇到+運算符,因此彈出3和4(3為棧頂元素,4為次頂元素,注意與后綴表達式做比較),計算出3+4的值,得7,再將7入棧;
(3) 接下來是×運算符,因此彈出7和5,計算出7×5=35,將35入棧;
(4) 最后是-運算符,計算出35-6的值,即29,由此得出最終結果。
可以看出,用計算機計算前綴表達式的值是很容易的。
詳細解釋:http://blog.csdn.net/antineutrino/article/details/6763722/

給出一個中綴表達式如下:
a+b*c-(d+e) 
第一步:按照運算符的優先級對所有的運算單位加括號,
         式子變成了:((a+(b*c))-(d+e)) 
第二步:轉換前綴與后綴表達式 
         前綴:把運算符號移動到對應的括號前面 
               則變成了:-( +(a *(bc)) +(de)) 
               把括號去掉:-+a*bc+de   前綴式子出現 
         后綴:把運算符號移動到對應的括號后面 
               則變成了:((a(bc)* )+ (de)+ )- 
               把括號去掉:abc*+de+-   后綴式子出現

<1> 將中綴表達式“1+((2+3)*4)-5”轉換為前綴表達式。

(1)構建兩個棧,一個存運算符一個存操作數。運算符(以括號分界點)在棧內遵循越往棧頂優先級不降低的原則排序。

(2)從右往左掃描中綴式表達式,從右邊第一個字符開始判斷。

  如果當前字符是數字,則分配到數字串的結尾並將數字串直接輸出。

  如果是運算符,則比較優先級。如果當前運算符的優先級大於等於棧頂運算符的優先級(當棧頂是括號時,直接入棧),則將運算符直接入棧;否則將棧頂運  算符出棧並輸出,直到當前運算符的優先級大於等於棧頂運算符的優先級(當棧頂元素是括號直接入棧),再將當前運算符入棧。如果是括號,則根據括號的  方向進行處理。如果是括號直接入棧;否則,遇右括號前將所有的運算符全部出棧並輸出,遇右括號后將左右的兩括號一起刪除。

(3)重復上述操作(2)直至掃描結束,將棧內剩余運算符全部出棧並輸出,再將綴輸出字符串。中綴表達式就變成了前綴表達式了。

 

中綴表達式

前綴表達式

(棧頂)運算符棧(棧尾)

說明

5

5

5,是數字串直接輸出

-

5

-

-,棧內無運算符,直接入棧

5

-)

),直接入棧

4

5 4

-)

4,是數字串直接輸出

*

5 4

-)*

*,棧頂是括號,直接入棧

)

5 4

- ) * )

),直接入棧

3

5 4 3

- ) * )

3,是數字串直接輸出

+

5 4 3

- ) * ) +

+,棧頂是括號,直接入棧

2

5 4 3 2

- ) * )+

2,是數字串直接輸出

(

5 4 3 2+

- ) *

(,

(

5 4 3 2+*

-

(,

+

5 4 3 2+*

-+

+,優先級大於等於棧頂運算符,直接入棧

1

5 4 3 2+*1

-+

1,是數字串直接輸出

5 4 3 2+*1+-

掃描結束,將棧內剩余運算符全部出棧並輸出

- + 1 * + 2 3 4 5

逆綴輸出字符串

【2】中綴表達式轉換為后綴表達式

 

過程和【1】差不多,只不過是從左往右掃描,方向換了一個,其他一樣。

還是這個式子:1+((2+3)*4)-5

 

中綴表達式

后綴表達式

(棧頂)運算符棧(棧尾)

說明

1

1

1,是數字串直接輸出

+

1

+

+,棧內無運算符,直接入棧

1

+(

(,直接入棧

1

+((

(,直接入棧

2

1 2

+((

2 ,數字

+

1 2

+((+

+,直接入棧

3

1 2 3

+((+

3,是數字串直接輸出

1 2 3 +

+(

碰到 )找到(之前所有符號彈出出

*

1 2 3 +

+(*

*

4

1 2 3 + 4

+(*

4

1 2 3 + 4 *

+

碰到 )找到(之前所有符號彈出出

-

1 2 3 + 4 *

+ -

-

5

1 2 3 + 4 *5

+ -

5

1 2 3 + 4 *5 - +

掃描結束

1 2 3 + 4 *5 - +

逆綴輸出字符串

 

后綴表達式逆向求解中綴表達式

1 2 3 + 4 *5 - +

基本思路和上面的一樣:遞歸,碰到操作符就進入遞歸。

從左往右掃描先碰到+號,取+號前面兩個操作數:2,3 得到:2+3.

繼續往下掃碰到*號,取4 和2+3 得到:(2+3)*4

-號,取(2+3)*4和5得到::(2+3)*4-5

+號:取(2+3)*4-5和1得到::1+(2+3)*4-5


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM