中缀表达式求值

def calculate(s) -> float:
    def domath(op,op1,op2):
        if op=='*':
            return op1*op2
        elif op=='/':
            return op1/op2
        elif op=='+':
            return op1+op2
        elif op=='-':
            return op1-op2
        else: # ^ 
            return op1**op2
    def doOperand(op):
        operand2 = operandStack.pop()
        operand1 = operandStack.pop()
        result = domath(op,operand1,operand2)
        operandStack.push(result) #求出的值压回操作数栈
        
    prec = {'^':4,'*':3,'/':3,'+':2,'-':2,'(':1} #运算符优先级
    opStack = Stack()  #运算符栈
    operandStack = Stack()  #操作数栈
    tokenlist = s.split()
    for token in tokenlist:
        if token.isnumeric():  #检测字符串是否只由数字组成
            operandStack.push(float(token)) #操作数入栈
        elif token == '(':
            opStack .push(token) #左括号入栈
        elif token == ')': 
            #碰到右括号,把栈里左括号上面的运算符都弹出求值
            topToken = opStack.pop()
            while topToken != '(': #做计算,取下一个操作符
                doOperand(topToken)
                topToken = opStack.pop()
        else: # 某个运算符
            while (not opStack.isEmpty()) and \
                  (prec[opStack.peek()]>=prec[token]): #做计算
                topToken = opStack.pop()
                doOperand(topToken)
            opStack.push(token) #注意最后让当前运算符进栈
    #表达式遍历完后,栈里剩下的操作符继续求值
    while not opStack.isEmpty():
        topToken = opStack.pop()
        doOperand(topToken)
    return operandStack.pop()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值