题解 | #表达式求值#
表达式求值
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))
查看7道真题和解析