標籤:
尾碼運算式逆波蘭記法中,操作符置於運算元的後面。例如表達“三加四”時,寫作“3 4 +”,而不是“3 + 4”。如果有多個操作符,操作符置於第二個運算元的後面,所以常規中綴記法的“3 - 4 + 5”在逆波蘭記法中寫作“3 4 - 5 +”:先3減去4,再加上5。使用逆波蘭記法的一個好處是不需要使用括弧。例如中綴記法中“3 - 4 * 5”與“(3 - 4)*5”不相同,但尾碼記法中前者寫做“3 4 5 * -”,無歧義地表示“3 (4 5 *) ?”;後者寫做“3 4 - 5 *”。
來源: https://zh.wikipedia.org/wiki/%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E7%A4%BA%E6%B3%95
調度場演算法
- 當還有記號可以讀取時
- 讀取一個記號
- 表示一個數字,添加到輸出隊列中
- 表示一個函數,壓入棧中
- 一個函數參數的分隔字元(,)
- 從佔中不斷的彈出操作符,並且放入輸出隊列中去,知道棧頂部的元素為一個左括弧為止。
- 一個操作符,記做O1
- 只要存在另一個O2的操作符位於棧的頂端
- 如果O1是左結合性的並且它的運算子優先順序要小於或等於O2的優先順序,或者如果O1是右結合性的並且它的運算子優先順序比O2的低,那麼O2從棧頂彈出並且放入輸出隊列中(迴圈直至以上條件不滿足為止,如果O1左結合性,直到遇上優先順序比O1低的,停止,如果O1右結合性,直到遇上優先順序比O1相等的或低的)
- 然後,將O1壓入棧的頂端
- 左括弧
- 右括弧
- 從棧當中不斷的彈出操作符並且放入輸出隊列中,直到彈出的元素為左括弧為止
- 將左括弧從棧的頂部彈出,但並不放入輸出隊列中去
- 如果在找到一個左括弧之前,棧就已經彈出了所有元素,那麼久表明在運算式中存在不匹配的括弧
- 當再沒有記號可以讀取時
- 如果在棧中還有操作符
- 如果此時位於站頂端的操作符是一個括弧,那麼就表示在運算式中存在不匹配的括弧
- 將操作符逐個彈出並放入輸出隊列中去
- 退出演算法
尾碼運算式(逆波蘭)求值一般是基於堆棧的,演算法一般這樣描述
運算元入棧,遇到操作符時,運算元出棧,求值,將結果入棧;如此重複。
虛擬碼
- while有輸入符號
- 讀入下一個符號x
- IF X是一個運算元
- ELSE IF X是一個操作符
- 有一個先驗的表格給出該操作符需要n個參數
- IF堆棧少於n個運算元
- ELSE,n個運算元出棧
- 計算操作符
- 將計算所得的值入棧
- IF 棧內只有一個值
- ELSE 多餘一個值
實際實現過程中出現的問題字串如何切割成一個字元
for(int i; i <expss.lengh();i++) visit(new Character(s.charAt(2)).toString());
判斷字串是否數字http://javapub.iteye.com/blog/666544
equals的使用java的參考型別
需要加入Regex
public static boolean isInteger(String str) { Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$"); return pattern.matcher(str).matches(); }
匹配空格\s字串轉化為數字
靜態成員初始化中間會拋出兩次除法注意除數和被除數還差小數沒調整好
中綴運算式轉化為尾碼運算式