需求
輸入字符串如 `1+2/3+5.4*7.5-8.3`,解析並計算結果。不支持負數運算(如 `-1+2`)。
核心思路:中綴轉後綴 + 棧計算
- 詞法分析:掃描字符串,提取數字、運算符(`+ - * /`)、括號。
- 中綴轉後綴:使用運算符優先級棧,輸出後綴表達式(逆波蘭表示法)。
- 後綴求值:掃描後綴表達式,遇數入棧,遇運算符彈出兩數運算後入棧,最終棧頂為結果。
參考實現
完整代碼參考博客:Java 表達式求值(中綴轉後綴),包含 `Token`、`Parser`、`Calculator` 三類,處理優先級、括號、空白字符。
關鍵點提示
- 數字解析需支持浮點數(`Double.parseDouble`)。
- 運算符優先級:`* /` > `+ -`;左結合。
- 錯誤處理:除零、非法字符、括號不匹配拋出異常。
- 擴展:若需支持負數,詞法階段識別一元 `-`(如行首、`(` 後、`運算符` 後)作為負號合併到數字中。
替代方案
引入表達式引擎:AviatorScript、Expression Language (EL)、Janino(動態編譯),一行代碼完成計算,適合生產環境。