题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d
d = input().strip()
expression = []
oprs = []
nums = []
ops = {
"*": lambda x, y: x * y,
"/": lambda x, y: x / y,
"-": lambda x, y: x - y,
"+": lambda x, y: x + y,
}
def recursive(expression: list[str], start: int):
i = start
oprs = []
nums = []
while i < len(expression):
cur = expression[i]
if cur.isnumeric():
nums.append(int(cur))
i += 1
elif cur in "+":
oprs.append(cur)
i += 1
elif cur == "-":
if nums:
oprs.append("+")
if expression[i + 1].isnumeric():
nums.append(int(cur + expression[i + 1]))
i += 2
else:
r, step = recursive(expression, i + 2)
i = step
nums.append(-r)
elif cur == '(':
r, step = recursive(expression, i + 1)
nums.append(r)
i = step
elif cur == ")":
while oprs:
o = oprs.pop()
num1 = nums.pop()
num2 = nums.pop()
r = ops[o](num2, num1)
nums.append(r)
return nums[0], i + 1
elif cur in "*/":
nxt = expression[i + 1]
i += 1
if nxt.isnumeric():
num = nums.pop()
r = ops[cur](num, int(nxt))
nums.append(r)
i += 1
else:
oprs.append(cur)
while oprs:
o = oprs.pop()
num1 = nums.pop()
num2 = nums.pop()
r = ops[o](num2, num1)
nums.append(r)
return nums[0], len(expression) - 1
i = 0
while i < len(d):
if d[i].isnumeric():
temp = d[i]
is_break = False
for j in range(i + 1, len(d)):
if d[j].isnumeric():
temp += d[j]
else:
expression.append(temp)
is_break = True
i = j
break
if not is_break:
i += 1
expression.append(temp)
else:
expression.append(d[i])
i += 1
r, _ = recursive(expression, 0)
print(r)
牛客公司氛围 254人发布
