Python中缀表达式转后缀表达式并求值

Python中缀表达式转后缀表达式并求值

  话不多说直接上代码,代码注释中有大概的思路。

代码

import sys

'''中缀表达式转后缀表达式求值'''

'''逆波兰表达式求值过程
从左到右扫描后缀表达式
1.若是操作数,就压栈,
2.若是操作符,就连续弹出两个操作数,根据操作符计算两个操作数,最后把计算结果再次压到栈顶,
3.栈顶的值即为计算最终结果
注:先弹出的是第一操作数,后弹出的是第二操作数
'''

'''逆波兰表达式求值,参数是列表存储的表达式'''
def calcRevPolishNotation(numList = []):
    zhan = []
    i = 0
    while i < len(numList):
        re = 0
        if(numList[i].isdigit()):
            zhan.append(numList[i])        # 执行第1步
        else:
            a = float(zhan.pop())          # 执行第2步
            b = float(zhan.pop())
            if(numList[i] == '+'):
                re = b + a
            elif(numList[i] == '-'):
                re = b - a
            elif (numList[i] == '*'):
                re = b * a
            elif (numList[i] == '/'):
                re = b / a
            zhan.append(str(re))
        i += 1
    return zhan.pop()                      # 执行第3步

'''中缀表达式转后缀表达式步骤
1.遇到操作数:添加到后缀表达式中或直接输出
2.栈空时:遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,输出到后缀表达式,直到弹出的是左括号(注意:左括号不输出到后缀表达式)
5.遇到其他运算符:弹出所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈
6.将栈中剩余内容依次弹出后缀表达式
'''

'''中缀表达式字符串转换为列表'''
def zhongToList(str = ''):
    i = 0
    numStr = ''
    flag = False
    numList = []
    while i < len(str):
        if(str[i].isdigit()):
            numStr += str[i]
            flag = True
        else:
            if(flag):
                numList.append(numStr)
                numStr = ''
                flag = False
            numList.append(str[i])
        i += 1
    if(flag):
        numList.append(numStr)
    return numList

'''中缀表达式转后缀表达式,所有表达式都是列表存储的'''
def listToHou(numList = []):
    level = {'(':0, '+':1, '-':1, '*':2, '/':2}
    stack = []
    RevPolishNotation = []
    i = 0
    while i < len(numList):
        if(numList[i].isdigit()):
            RevPolishNotation.append(numList[i])        # 执行第1步
        else:
            if(len(stack) == 0 or numList[i] == '('):
                stack.append(numList[i])                # 执行第2,3步
            elif(numList[i] == ')'):
                while True:                             # 执行第4步
                    out = stack.pop()
                    if(out != '('):
                        RevPolishNotation.append(out)
                    else:
                        break
            else:
                while True:                             # 执行第5步
                    if(len(stack) != 0 and level[stack[-1]] >= level[numList[i]]):
                        out = stack.pop()
                        RevPolishNotation.append(out)
                    else:
                        stack.append(numList[i])
                        break
        i += 1
    while True:                                         # 执行第六步
        if(len(stack) != 0):
            out = stack.pop()
            RevPolishNotation.append(out)
        else:
            break
    return RevPolishNotation

'''中缀表达式求值'''
def calc(str = ''):
    return calcRevPolishNotation(listToHou(zhongToList(str)))

if __name__ == "__main__":
    print(calc(sys.argv[1]))
    
'''示例表达式
12+(23+34*45-10)/2=783.5
34-12*(4+100)/(2+3)-4*(5-1)+100=-131.6
'''

你可能感兴趣的:(Python中缀表达式转后缀表达式并求值)