简单四则运算解析器 | 豆包MarsCode AI刷题

119 阅读1分钟

简单四则运算解析器

实现一个基本的计算器来计算一个简单的字符串表达式的值。注意事项如下:

  • 输入是一个字符串表达式(可以假设所给定的表达式都是有效的)
  • 字符串表达式可以包含的运算符号为:左括号 (, 右括号 ), 加号 +, 减号 -
  • 可以包含的数字为:非负整数(< 10)
  • 字符串中不包含空格
  • 处理除法 case 的时候,可以直接省略小数部分结果,只保留整数部分参与后续运算
  • 请不要使用内置的库函数 eval
def solution(expression):
    num = []  # 用来存放数字的栈
    op = []   # 用来存放运算符的栈
    pr = {'+': 1, '-': 1, '*': 2, '/': 2}  # 运算符优先级
    
    def eval():
        a = num.pop()
        b = num.pop()
        c = op.pop()
        if c == '+':
            x = b + a
        elif c == '-':
            x = b - a
        elif c == '*':
            x = a * b
        else:  # c == '/'
            x = b // a  # 用整除,确保结果为整数
        num.append(x)
    
    i = 0
    while i < len(expression):
        t = expression[i]
        if t.isdigit():  # 判断是否为数字
            num.append(int(t))  # 将字符转换为数字
        elif t == '(':
            op.append(t)
        elif t == ')':
            while op and op[-1] != '(':
                eval()
            op.pop()  # 弹出 '('
        else:  # 运算符
            while op and op[-1] != '(' and pr[op[-1]] >= pr[t]:
                eval()
            op.append(t)
        i += 1

    while op:  # 处理剩余的运算符
        eval()
    
    return num[-1]  # 返回最终结果

if __name__ == "__main__":
    #  You can add more test cases here
    print(solution("1+1") == 2)
    print(solution("3+4*5/(3+2)") == 7)
    print(solution("4+2*5-2/1") == 12)
    print(solution("(1+(4+5+2)-3)+(6+8)") == 23)