首先是將中綴表示式轉化為字尾表示式:
在計算機中計算乙個字尾表示式的值要比計算乙個中綴表示式的值簡單的多
實現轉換的基本步驟如下:
1.初始化乙個運算子棧。
2.從算數表示式輸入的字串中依次從左向右每次讀取乙個字元。
3.如果當前字元是運算元,則直接填寫到字尾表示式。
4.如果當前字元是(左括號,將其壓入運算子棧(第一步定義)。
5.如果當前字元為運算子,則分兩種情況:
.當運算子棧為空,將其壓入運算子棧。
.當此運算子的優先順序大於棧頂元素的時候),則將此運算子壓入運算子棧;否則,彈出棧頂運算子到字尾表示式,反覆彈出,直到該運算子優先順序大於棧頂元素或者棧為空時,然後將當前運算子壓棧。回到步驟2繼續讀取.
6.如果當前字元是)右括號,反覆將棧頂元素彈出到字尾表示式,直到棧頂元素是左括號(為止,並將左括號從棧中彈出丟棄。
7.如果讀取還未完成,回到步驟2.
8.如果讀取完成,則將棧中剩餘的運算子依次彈出到字尾表示式。
舉個例子:
a+b*c-(d+e)
1.讀取到運算元 a,將其放入最終字尾表示式,此時表示式為:a , 棧為空
2.讀取到運算子 +,此時棧為空,+ 入棧,此時表示式為:a , 棧為:+
3.讀取到運算元 b, 將其放入最終字尾表示式,此時表示式為:ab , 棧為: +
4.讀取到運算子 *, 棧不為空,* 優先順序大於棧頂元素 + ,* 入棧,此時表示式為:ab , 棧為: +*
5.讀取到運算元 c, 將其放入最終字尾表示式,此時表示式為:abc , 棧為: +*
6.讀取到運算子 -,棧不為空, - 優先順序小於棧頂元素 *,* 出棧,此時表示式為:abc* , 棧為: +,
-優先順序等於棧頂元素 +, + 出棧,此時表示式為:abc*+ , 棧為: 空
棧為空,所以 - 入棧,此時表示式為:abc*+ , 棧為: -
7.讀取到運算子( , ( 直接入棧,此時表示式為:abc*+ , 棧為: -(
8.讀取到運算元 d,將其放入最終字尾表示式,此時表示式為:abc*+d , 棧為: -(
9.讀取到運算子 +,+ 優先順序大於 ( , + 入棧,此時表示式為:abc*+d , 棧為: -(+
10.讀取到運算元 e,將其放入最終字尾表示式,此時表示式為:abc*+de , 棧為: -(+
11.讀取到運算子 ),棧頂元素為 +,出棧 ,此時表示式為:abc*+de+ , 棧為: -(
棧頂元素為( ,出棧, 此時表示式為:abc*+de+ , 棧為: -
12,此時表示式已經遍歷完畢,按順序出棧,棧頂元素為 - ,出棧,此時表示式為:abc*+de+- , 棧為: 空
結束。
字尾表示式求值:
從左到右讀取
1、設定乙個棧,開始時,棧為空;
2、然後從左到右掃瞄字尾表示式,若遇運算元,則進棧;
3、若遇運算子,則從棧中退出兩個元素,先退出的放到運算子的右邊,後退出的放到運算子左邊,運算後的結果再進棧,直到字尾表示式掃瞄完畢;
4、最後,棧中僅有乙個元素,即為運算的結果。
四則表示式
四則表示式求值,過了北大百練,放心用哈 北大百練url include include include include includeusing namespace std const int maxn 1000000 char str maxn 可以定義乙個字元變數,儲存c前的乙個字元,這樣就可以...
四則表示式實現原理 F hawk189
首先是將中綴表示式轉化為字尾表示式 在計算機中計算乙個字尾表示式的值要比計算乙個中綴表示式的值簡單的多 實現轉換的基本步驟如下 1.初始化乙個運算子棧。2.從算數表示式輸入的字串中依次從左向右每次讀取乙個字元。3.如果當前字元是運算元,則直接填寫到字尾表示式。4.如果當前字元是 左括號,將其壓入運算...
四則表示式求值
題目 openjudge 重慶十一中 寒假歡樂賽 總時間限制 1000ms 記憶體限制 65536kb 描述 求乙個可以帶括號的小學算術四則運算表示式的值 輸入一行,乙個四則運算表示式。表示乘法,表示除法 輸出一行,該表示式的值,保留小數點後面兩位 樣例輸入 輸入樣例1 3.4輸入樣例2 7 8.3...