原始逆波蘭式算法(未考慮負數、函數調用情況)
2、若讀取的是操作數,則判斷該操作數的類型,並將該操作數存入操作數堆棧
3、若讀取的是運算符
(1) 該運算符為左括號"(",則直接存入運算符堆棧。
(2) 該運算符為右括號")",則輸出運算符堆棧中的運算符到操作數堆棧,直到遇到左括號為止,此時拋棄該左括號。
(3) 該運算符為非括號運算符:
(a) 若運算符堆棧棧頂的運算符為左括號,則直接存入運算符堆棧。
(b) 若比運算符堆棧棧頂的運算符優先級高,則直接存入運算符堆棧。
(c) 若比運算符堆棧棧頂的運算符優先級低或相等,則輸出棧頂運算符到操作數堆棧,直至運算符棧棧頂運算符低於(不包括等於)該運算符優先級,或為左括號,
並將當前運算符壓入運算符堆棧。
4、當表達式讀取完成后運算符堆棧中尚有運算符時,則依序取出運算符到操作數堆棧,直到運算符堆棧為空。
1.構建兩個棧Operand(操作數棧)和Operator(操作符棧)和一個LAST_TOKEN標記字段。
2.掃描給定的字符串,掃描時注意跳過空格,提取完整的操作數、操作符和函數。
3.如果獲得一個運算符(用B代替)首先構造響應的運算符,構造時需要比較LAST_TOKEN記錄字段,來判斷重載的操作符的含義,比如如果LAST_TOKEN是數字,那么“-”就是一 個數學運算符,如果LAST_TOKEN是運算符,那么要看“-”后面是不是數字,如果是數字,則認為“-”是“負號”。構造好Operator后和Operator棧棧頂元素(用A替代)比 較:
1)如果A不存在,則把B壓入Operator棧中;
2)如果B是一個左括號,則忽略A和B的優先級比較,把B壓入Operator棧。
3)如果B是逗號,同樣忽略A和B的比較,把B壓入Operator棧。
4)如果B是一個右括號,則把Operator棧順序出棧,然后把彈出的元素順序壓入Operand棧中,出棧是需要判斷逗號情況,如果是逗號,則不入棧,記錄逗號個數,直到棧頂彈出 的是左括號,括號不入Operand棧中。之后看Operator棧頂元素,如果棧頂元素是函數類型,則把函數Operator出棧然后將逗號個數+1構造數字操作數壓入Operand棧中,然 后把函數Operator也壓入Operand棧中。
5)如果A是左括號,則把B直接壓入Operator棧。
6)如果B優先級比A高,則把B直接壓入Operator棧。
7)如果B優先級低於或等於A的優先級,則把A出棧然后壓入Operand棧,反復進行此步驟直到棧頂優先級高於B的優先級或者棧頂是一個括號。
4.掃描完畢后,把Operator棧的元素依次出棧,然后依次壓入Operand棧中。