字首表示式、中綴表示式、字尾表示式總結
一、字首表示式
(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 -”