双栈+递归
支持加减乘除,整除,取余和次幂运算。
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)