算法學習一之逆波蘭表達式

1.逆波蘭表達式也稱後綴表達式,即操作符在操作數之後。


2.如何將數字表達式轉換爲逆波蘭表達式

(1)算法如下:

        設置兩個棧,一個操作符棧,一個結果數組。操作符棧棧頂元素初始化爲'\0'。運算符的優先級定爲+-小於*/。

        如果讀入的是運算數,直接存入結果數組。

        如果讀入的是運算符,如果當前運算符的優先級大於操作符棧頂運算符的優先級,直接將當前運算符入運算符棧;如果當前運算符的優先級小於或者等於操作符棧頂運算符的優先級,將操作符棧頂運算符出棧再存入結果數組,再將當前運算符入棧到操作符棧。

       如果讀入的是(,直接入操作符棧。

       如果讀入的是),將操作符棧中的符號全都出棧再存入結果數組,直到遇到(,並將(出棧。


(2)代碼如下:用的是python語言

import types


numbers=[1,'+',2,'*','(',3,'+',4,'-',5,')','/',6]
characters=[]
result=[]
characters.append('\0')
priority={}
priority['\0']=-1
priority['+']=0
priority['-']=0
priority['*']=1
priority['/']=1
priority['(']=-1#(後面的任何運算符都得入棧
print(numbers)

while numbers:
    aChar=numbers.pop(0)
    if type(aChar) == type(1):
        print(aChar)
        result.append(aChar)
    elif aChar == '(':
        characters.append(aChar)
    elif aChar == ')':
        bChar=characters.pop()
        while bChar!='(':
            print(bChar)
            result.append(bChar)
            bChar=characters.pop()
    else:
        topChar=characters[len(characters)-1]
        if priority[aChar]>priority[topChar]:
            characters.append(aChar)
        else :
            while priority[aChar]<=priority[topChar]:
                bChar=characters.pop()
                print(bChar)
                result.append(bChar)
                topChar=characters[len(characters)-1]
            characters.append(aChar)

while characters:
    result.append(characters.pop())
    
while result:
    print(result.pop())


3.計算逆波蘭表達式

直接順序掃描結果數組,遇到運算數入棧,遇到運算符,按規則出棧並計算,並將計算結果入棧。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章