表达式求值相关算法

本文介绍了如何求解数学表达式的步骤,包括语法分析、将中缀表达式转换为逆波兰表达式、逆波兰表达式求值、逆波兰表达式转二叉树以及使用二叉树进行求值。详细阐述了每个步骤的具体实现,如栈的运用和递归计算,旨在提供一种高效计算表达式的方法。
摘要由CSDN通过智能技术生成

实现对一个数学表达式的求值,例如:1+2*(3+4) 这个表达式的值为 15

这个问题主要要分为如下几个步骤:

  1. 语法分析: 将字符串表达式转化为数字和操作符的 token 数组,['1', '+', '2', '*', '(', '3', '+', '4', ')']
  2. 转逆波兰表达式: 将中缀表达式转后缀表达式,['1', '2', '3', '4', '+', '*', '+']
  3. 逆波兰表达式求值: 15

逆波兰表达式转二叉树: 条件表达式中,二叉树的求值能提前返回,能比逆波兰表达式计算量更少

语法分析

def tokenizer(expr):
    l = len(expr)
    i = 0
    tokens = []
    while i < l:
        while expr[i] == ' ':
            i += 1
        if is_operator(expr[i]):
            if i + 1 == l:
                return None
            if expr[i] == '-':
                if tokens and (not is_operator(tokens[-1]) and not tokens[-1] == '('):
                    tokens.append(expr[i])
                    i += 1
                else:
                    j = i + 1
                    while j < l and not is_operator(expr[j]) and not is_parenthesis(expr[j]):
                        j += 1
                    tokens.appen
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值