题解 | #表达式求值#

表达式求值

https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d

'''
它首先定义了一个compute函数,用于递归计算表达式的值。在这个函数中,使用了循环遍历字符串s中的每一个字符,并根据不同的情况进行处理。
如果遇到数字,则将其加入到num中;
如果遇到左括号,则递归调用compute函数计算括号内的表达式的值num;
如果遇到运算符或者字符串结尾,则根据运算符将num与栈顶元素进行相应的运算,并将结果压入栈中;
最后,将栈中所有元素相加即可得到整个表达式的值。
'''

def compute(s, left, right):
    op = "+" # 初始化计算符为加号,后续遇到操作符就更新
    num = 0 # 计算当前值
    st = [] # 栈
    while left <= right:
        '如果遇到数字,则将其加入到num中'
        if s[left].isdigit():
            num = num * 10 + int(s[left])
        #'如果遇到左括号,则递归调用compute函数计算括号内的表达式的值'
        elif s[left] == "(": # 进入左括号
            layer = 1 # 统计左括号层数
            j = left + 1
            while j <= right: # 遍历到右边
                if s[j] == "(":
                    layer += 1 # 遇到左括号,层数累加
                elif s[j] == ")":
                    layer -= 1 # 遇到右括号层数递减
                    if layer == 0: # 直到层数为0
                        break
                j += 1
            num = compute(s=s[left + 1: j], left=0, right=len(s[left + 1: j])-1) # 递归计算括号中的部分
            left = j # 计算完括号的内容,left索引更新为右括号处索引j
        '如果遇到运算符或者字符串结尾, 则根据运算, 并将结果压入栈st'
        if not s[left].isdigit() or left == right: # 遇到运算符或者结尾
            if op == "+":
                st.append(num) # 加减法加入到末尾
            elif op == "-":
                st.append(-num)
            elif op == "*":
                st[-1] *= num # 乘除法与末尾计算
            elif op == "/":
                st[-1] /= num
            op = s[left] # 更新计算符
            num = 0 #  利用num更新完栈就把当前计算值num置为0
        left += 1
    return sum(st) # 累加和

s = input() # '2+(2+4*3)*(2)' 
print(compute(s, left=0, right=len(s) - 1))

全部评论

相关推荐

粗心的雪碧不放弃:纯学历问题,我这几个月也是一直优化自己的简历,后来发现优化到我自己都觉得牛逼的时候,发现面试数量也没有提升,真就纯学历问题
点赞 评论 收藏
分享
面试摇了我吧:啊哈哈面试提前五个小时发,点击不能参加就是放弃
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务