关注
def calculate(s: str) -> int:
def precedence(op):
"""定义运算符优先级:乘除 > 加减"""
return 2 if op in ('*', '/') else 1
def apply_op(a: int, b: int, op: str) -> int:
"""执行运算"""
if op == '+':
return a + b
elif op == '-':
return a - b
elif op == '*':
return a * b
elif op == '/':
return a // b 整数除法,可根据需求改为浮点数除法
预处理:去除空格,大括号转为小括号(仅支持小括号逻辑)
s = s.replace(' ', '').replace('{', '(').replace('}', ')')
nums = [] 数字栈
ops = [] 运算符栈
i = 0
n = len(s)
while i < n:
if s[i].isdigit():
处理多位数(如123)
num = 0
while i < n and s[i].isdigit():
num = num * 10 + int(s[i])
i += 1
nums.append(num)
elif s[i] == '(':
ops.append(s[i])
i += 1
elif s[i] == ')':
遇到右括号,弹出运算符直到左括号
while ops and ops[-1] != '(':
b = nums.pop()
a = nums.pop()
op = ops.pop()
nums.append(apply_op(a, b, op))
ops.pop() 弹出左括号
i += 1
elif s[i] in ('+', '-', '*', '/'):
处理运算符优先级:当前运算符优先级≤栈顶时,先执行栈顶运算
while ops and ops[-1] != '(' and precedence(ops[-1]) >= precedence(s[i]):
b = nums.pop()
a = nums.pop()
op = ops.pop()
nums.append(apply_op(a, b, op))
ops.append(s[i])
i += 1
else:
raise ValueError("无效字符:" + s[i])
处理剩余运算符
while ops:
b = nums.pop()
a = nums.pop()
op = ops.pop()
nums.append(apply_op(a, b, op))
return nums[0]
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享

点赞 评论 收藏
分享

点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 我的求职总结 #
26395次浏览 463人参与
# 你的房租占工资的比例是多少? #
22221次浏览 249人参与
# 毕业季,给职场新人一些建议 #
22611次浏览 398人参与
# 计算机专业还有必要去大厂卷吗 #
20249次浏览 103人参与
# 我的实习日记 #
2438263次浏览 25406人参与
# 辞职之后最想做的一件事 #
10862次浏览 161人参与
# 选offer应该考虑哪些因素 #
18844次浏览 284人参与
# 晒一晒你收到的礼盒 #
62355次浏览 373人参与
# 为了秋招你都做了哪些准备? #
10921次浏览 165人参与
# 薪资一样,你会选择去大厂还是小公司 #
16474次浏览 100人参与
# 你怀疑过自己的专业选择吗? #
17513次浏览 201人参与
# 第一份工作应该只看薪资吗 #
138811次浏览 1460人参与
# 你想吐槽公司的哪些规定 #
17461次浏览 68人参与
# 你想留在一线还是回老家? #
38080次浏览 447人参与
# 我的工作日记 #
97620次浏览 1268人参与
# Offer比较,求稳定还是求发展 #
49335次浏览 237人参与
# 你小时候最想从事什么职业 #
91518次浏览 1703人参与
# 秋招想进国企该如何准备 #
58095次浏览 375人参与
# 工作中的卑微时刻 #
9061次浏览 55人参与
# 你见过最离谱的招聘要求是什么? #
188345次浏览 1401人参与