实现对一个数学表达式的求值,例如:1+2*(3+4)
这个表达式的值为 15
这个问题主要要分为如下几个步骤:
- 语法分析: 将字符串表达式转化为数字和操作符的 token 数组,
['1', '+', '2', '*', '(', '3', '+', '4', ')']
- 转逆波兰表达式: 将中缀表达式转后缀表达式,
['1', '2', '3', '4', '+', '*', '+']
- 逆波兰表达式求值:
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