算法学习一之逆波兰表达式

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.计算逆波兰表达式

直接顺序扫描结果数组,遇到运算数入栈,遇到运算符,按规则出栈并计算,并将计算结果入栈。


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