1. 程式人生 > >字首表示式、中綴表示式、字尾表示式總結

字首表示式、中綴表示式、字尾表示式總結

一、字首表示式

(1)定義

字首表示式是一種沒有括號的算術表示式,其將運算子寫在前面,運算元寫在後面。例如表示式1-(2+3)的字首表示式是- 1 + 2 3。

(2)求值方法

對字首表示式求值,要從右至左掃描表示式,首先從右邊第一個字元開始判斷,若當前字元是數字則一直到數字串的末尾再記錄下來,若為運算子,則將右邊離得最近的兩個“數字串”作相應運算,然後以此作為一個新的“數字串”並記錄下來;掃描到表示式最左端時掃描結束,最後運算的值即為表示式的值。

例如:對字首表示式“- 1 + 2 3”求值,掃描到3時,記錄下這個數字串,掃描到2時,記錄下這個數字串,當掃描到+時,將+右移做相鄰兩數字串的運算子,記為2+3,結果為5,記錄下5這個新數字串,然後繼續向左掃描,掃描到1時,記錄下這個數字串,掃描到-時,將-右移做相鄰兩數字串的運算子,記為1-5,結果為-4,此時關於這個表示式的全部運算已完成,故表示式的值為-4。

(3)中綴表示式轉化為字首表示式

方法:從右往左掃描

例子:將中綴表示式“1+((2+3)*4)-5”轉換為字首表示式:

中綴表示式

字首表示式

(棧頂)運算子棧(棧尾)

說明

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

逆綴輸出字串


二、中綴表示式
 

(1)定義

是一個通用的算術或邏輯公式表示方法,操作符是以中綴形式處於運算元的中間(例:3+4),中綴表示式是人們常用的算術表示方法。

(2)中綴表示式“8+4-6*2”用字尾表示式表示為:8 4 + 6 2 * -

(3)中綴表示式“2*(3+5)+7/1-4”用字尾表示式表示為:3 5 + 2 * 7 1 /4 - +

三、字尾表示式

(1)定義

不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行(不在考慮運算子的優先規則),如:(2+1)*3,即2 1 + 3 *

(2)中綴表示式轉換為字尾表示式

思想:

開始掃描(從左往右);

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

運算子:

a. 若為’(‘,入棧

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

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

例子,將中綴表示式“1+((2+3)*4)-5”轉換為字尾表示式的過程如下:

中綴表示式

字尾表示式

(棧頂)運算子棧(棧尾)

說明

1

1

數字直接入棧

+

1

+

棧為空,直接入棧

(

1

+ (

左括號,直接入棧

(

1

+ ( (

左括號,直接入棧

2

1 2

+ ( (

數字直接入棧

+

1 2

+ ( ( +

棧頂為左括號,運算子直接入棧

3

1 2 3

+ ( ( +

數字直接入棧

)

1 2 3 +

+ (

右括號,彈出運算子直至遇到左括號

*

1 2 3 +

+ ( *

棧頂是左括號,運算子直接入棧

4

1 2 3 + 4

+ ( *

數字直接入棧

)

1 2 3 + 4 *

+

右括號,彈出運算子直至遇到左括號

-

1 2 3 + 4 * +

-

-與+優先順序相同,因此彈出+,再壓入-

5

1 2 3 + 4 * +  5

-

數字直接入棧

1 2 3 + 4 * +  5 -

剩餘的運算子


因此結果為“1 2 3 + 4 * + 5 -”