原始逆波蘭式算法(未考慮負數、函數調用狀況)算法
1.構建兩個棧Operand(操做數棧)和Operator(操做符棧)和一個LAST_TOKEN標記字段。函數
2.掃描給定的字符串,掃描時注意跳過空格,提取完整的操做數、操做符和函數。spa
3.若是得到一個運算符(用B代替)首先構造響應的運算符,構造時須要比較LAST_TOKEN記錄字段,來判斷重載的操做符的含義,好比若是LAST_TOKEN是數字,那麼「-」就是一 個數學運算符,若是LAST_TOKEN是運算符,那麼要看「-」後面是否是數字,若是是數字,則認爲「-」是「負號」。構造好Operator後和Operator棧棧頂元素(用A替代)比 較:字符串
1)若是A不存在,則把B壓入Operator棧中;數學
2)若是B是一個左括號,則忽略A和B的優先級比較,把B壓入Operator棧。di
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棧中。