字尾表示式的求值的演算法

PengPengBlog發表於2017-02-27

1 字尾表示式的求值
將中綴表示式轉換成等價的字尾表示式後,求值時,不需要再考慮運算子的優先順序,只需從左到右掃描一遍字尾表示式即可。具體求值步驟為:從左到右掃描字尾表 達式,遇到運算子就把表示式中該運算子前面兩個運算元取出並運算,然後把結果帶回字尾表示式;繼續掃描直到字尾表示式最後一個表示式。 
例如,字尾表示式(abc*+def*/-) 的求值

2 字尾表示式的求值的演算法
設定一個棧,開始時,棧為空,然後從左到右掃描字尾表示式,若遇運算元,則進棧;若遇運算子,則從棧中退出兩個元素,先退出的放到運算子的右邊,後退出的 放到運算子左邊,運算後的結果再進棧,直到字尾表示式掃描完畢。此時,棧中僅有一個元素,即為運算的結果。
例,求字尾表示式:1 2 + 8 2 - 7 4 - / * 的值, 
棧的變化情如下:

步驟

棧中元素

說明

1

1

1 進棧

2

12

2 進棧

3

 

遇+ 號退棧2 和1

4

3

1+2=3 的結果3 進棧

5

38

8 進棧

6

382

2 進棧

7

3

遇- 號退棧2 和8

8

36

8-2=6 的結果6 進棧

9

367

7 進棧

10

3674

4 進棧

11

36

遇- 號退棧4 和7

12

36

7-4=3 的結果3 進棧

13

3

遇/ 號退棧3 和6

14

32

6/3=2 的結果2 進棧

15

 

遇* 號退棧2 和3

16

6

3*2=6 進棧

17

6

掃描完畢,運算結束

從上可知,最後求得的字尾表示式之值為6 ,與用中綴表示式求得的結果一致,但字尾式求值要簡單得多。
五、中綴表示式變成等價的字尾表示式的演算法
將中綴表示式變成等價的字尾表示式,表示式中運算元次序不變,運算子次序發生變化,同時去掉了圓括號。轉換規則是:設立一個棧,存放運算子,首先棧為空, 編譯程式從左到右掃描中綴表示式,若遇到運算元,直接輸出,並輸出一個空格作為兩個運算元的分隔符;若遇到運算子,則必須與棧頂比較,運算子級別比棧頂級 別高則進棧,否則退出棧頂元素並輸出,然後輸出一個空格作分隔符;若遇到左括號,進棧;若遇到右括號,則一直退棧輸出,直到退到左括號止。當棧變成空時, 輸出的結果即為字尾表示式。將中綴表示式(1+2)*((8-2)/(7-4)) 變成等價的字尾表示式。
現在用棧來實現該運算,棧的變化及輸出結果如下:

步驟

棧中元素

輸出結果

說明

1

(

 

( 進棧

2

(

1

輸出1

3

(+

1

+ 進棧

4

(+

1 2

輸出2

5

 

1 2 +

+ 退棧輸出,退棧到( 止

6

*

1 2 +

* 進棧

7

*(

1 2 +

( 進棧

8

*((

1 2 +

( 進棧

9

*((

1 2 + 8

輸出8

10

*((-

1 2 + 8

輸出2

11

*((-

1 2 + 8 2

- 進棧

12

*(

1 2 + 8 2 -

- 退棧輸出,退棧到( 止

13

*(/

1 2 + 8 2 -

/ 進棧

14

*(/(

1 2 + 8 2 -

( 進棧

15

*(/(

1 2 + 8 2 - 7

輸出7

16

*(/(-

1 2 + 8 2 - 7

- 進棧

17

*(/(-

1 2 + 8 2 - 7 4

輸出4

18

*(-

1 2 + 8 2 - 7 4 -

- 退棧輸出,退棧到( 止

19

*

1 2 + 8 2 - 7 4 - /

/ 退棧輸出,退棧到( 止

20

 

1 2 + 8 2 - 7 4 - / *

* 退棧並輸出

 

 

相關文章