题解 | #四则运算#
四则运算
https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
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 栈
oprs.append(cur)
i += 1
elif cur == "-":
# 如果是减号,需要考虑减号后是否是数字,以及判断在此次调用中是否在表达式的开头
if nums:
# nums 栈非空,则不是在表达式开头,先入一个 + 号到 oprs 栈
# 因为减一个数等于加一个负数
oprs.append("+")
if expression[i + 1].isnumeric():
# 如果减号后跟的是一个数字,则减号和这个数字一起入 nums 栈,表示一个负数
nums.append(int(cur + expression[i + 1]))
# 指针需向后移两位
i += 2
else:
# 如果减号后不是数字,那么只能是括号,进行递归调用,优先计算括号内的
r, step = recursive(expression, i + 2)
i = step
# 将括号内计算的值连同减号一起入 nums 栈
nums.append(-r)
elif cur in "([{":
# 左括号,递归调用优先计算括号内的
r, step = recursive(expression, i + 1)
nums.append(r)
i = step
# 计算完括号内的,需查看当前左括号前的运算符是不是 */ 中的一种
if oprs and oprs[-1] in '*/':
# 是 */ 中的一种,则优先计算
o = oprs.pop()
num1 = nums.pop()
num2 = nums.pop()
r = ops[o](num2, num1)
nums.append(r)
elif cur in ")]}":
# 遇到右括号,将 oprs 栈内的运算符一个一个的出栈
# 每出一个运算符,同时出栈两个运算数来进行计算
# 并且注意由于栈的先入后出的特点,后出栈的运算数,是在运算中的第一个运算数
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)
# 当循环结束时,有可能 oprs 中存在优先级低的运算符
# 需要将 oprs 中的运算符全部取出做计算
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)
小天才公司福利 1165人发布
查看20道真题和解析