您好,登錄后才能下訂單哦!
這里先給出運算符的優先級,表中0級優先級最低,7級最高,如下:
優先級 | 0 | 1 | 2 | 3 4 5 6 7 |
運算符 | # | ( | , | +- */ @~ !%^ ) |
說明 | ||||
第一、生成逆波蘭表達式
首先構建一個存儲器,另一個符號棧,存儲器是從左向右儲存數據,而符號棧則遵守后進先出的原則,計算表達式按從左至右的順序掃描。
* 讀入一個數據(重點注意:數值與函數名非單個字符,需要做判斷處理)
1. 如果是左單目運算符或者函數名,直接入符號棧;比如 正負號 ~ @ max sin
2. 如果是右單目運算符,直接入存儲器棧;比如 階乘!與百分號%
3. 如果是運輸量,則直接寫入存儲器;檢查符號棧頂是否有單目運算符,有的話則全部出棧,并寫入存儲器;
4. 如果是左括號"(",則直接入符號棧;
5. 如果是右括號")",則彈出符號棧數據,寫入存儲器,一直到左括號彈出(左括弧直接丟棄,不寫入存儲器),再檢查棧頂是否為左單目運算符或者函數名,是的話繼續彈出,直到遇到雙目運算符;
6. 如果是雙目運算符,則與棧頂符號比較優先級,若大于棧頂優先級,則入棧;否則彈出棧頂符號并寫入存儲器,直到棧頂符號的運算優先級較小為止;
7.如果是函數參數的連接逗號“,”時,則彈出符號棧數據,直到遇到左括弧 ( 或者逗號,為止,再將逗號,入符號棧;
8.如果是結束符(表示表達式已全部讀完),則符號棧全部彈出并寫入存儲器,否則繼續按以上規則讀取下一個數據;
下面將逐步介紹逆波蘭式生成過程:
表達式按從左至右掃描,標記為紅色的字符為當前步驟掃描的字符:
0、預處理:為表達式添加一個結束標示符“#”,掃描時按雙目運算符考慮,
處理后表達式為:2+(8+4^2)*3#
1、2+(8+4^2)*3#:掃描“2”,按規則3,將運算量 2壓入存儲器,如下:
存儲器
2 |
符號棧:暫空
2、2+(8+4^2)*3#:掃描“+”,按規則6,將加號壓入符號棧,如下:
2 |
+ |
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。