逆波蘭表達式算法原理記錄

原始逆波蘭式算法(未考慮負數、函數調用狀況)算法

一、從左至右掃描一中綴表達式。
二、若讀取的是操做數,則判斷該操做數的類型,並將該操做數存入操做數堆棧
三、若讀取的是運算符
      (1) 該運算符爲左括號"(",則直接存入運算符堆棧。
      (2) 該運算符爲右括號")",則輸出運算符堆棧中的運算符到操做數堆棧,直到遇到左括號爲止,此時拋棄該左括號。
      (3) 該運算符爲非括號運算符:
      (a) 若運算符堆棧棧頂的運算符爲左括號,則直接存入運算符堆棧。
      (b) 若比運算符堆棧棧頂的運算符優先級高,則直接存入運算符堆棧。
      (c) 若比運算符堆棧棧頂的運算符優先級低或相等,則輸出棧頂運算符到操做數堆棧,直至運算符棧棧頂運算符低於(不包括等於)該運算符優先級,或爲左括號,
           並將當前運算符壓入運算符堆棧。
四、當表達式讀取完成後運算符堆棧中尚有運算符時,則依序取出運算符到操做數堆棧,直到運算符堆棧爲空。
 

 
改進的逆波蘭式算法(考慮負數、函數調用狀況)

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棧中。

相關文章
相關標籤/搜索