双栈+递归
支持加减乘除,整除,取余和次幂运算。
def solve(s):
priority = {'+':0, '-':0, '*':1, '/':1, '//':1, '%':1, '**':2}
def operate(numbers, operators):
num2 = numbers.pop()
num1 = numbers.pop() if numbers else '0' # 处理减号作为一元运算符的情况,如"-3+2*3*4-1"
numbers.append(str(eval(num1+operators.pop()+num2)))
def calculate(s, i):
operators = []
numbers = []
while i < len(s):
if s[i] == ' ':
pass
elif s[i] == ')':
while operators:
operate(numbers, operators) # 处理尾部元素
return i, numbers[0]
elif s[i] == '(':
i, num = calculate(s, i+1) # 遇到括号,递归
numbers.append(num)
elif s[i] in priority:
if not operators: # 入栈操作符
if s[i] == s[i+1]: # 处理**和//操作符
operators.append(s[i]+s[i+1])
i += 1
else:
operators.append(s[i])
else:
if priority[operators[-1]] >= priority[s[i]]: # 上一个操作符优先级不低于当前操作符
operate(numbers, operators) # 取值取操作符并计算
if s[i] == s[i+1]: # 处理**和//操作符
operators.append(s[i]+s[i+1])
i += 1
else:
operators.append(s[i])
else:
if s[i] == s[i+1]: # 处理**和//操作符
operators.append(s[i]+s[i+1])
i += 1
else:
operators.append(s[i])
else:
num = ''
while i < len(s) and '0' <= s[i] <= '9':
num += s[i]
i += 1
numbers.append(num)
i -= 1
i += 1
while operators:
operate(numbers, operators) # 处理尾部元素
return float(numbers[0])
return calculate(s, 0)

京公网安备 11010502036488号