题解 | #表达式求值#
表达式求值
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))