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