关注
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]
查看原帖
点赞 评论
相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享

点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 我的求职总结 #
18657次浏览 357人参与
# 辞职之后最想做的一件事 #
9268次浏览 148人参与
# 毕业季,给职场新人一些建议 #
16322次浏览 290人参与
# 我的工作日记 #
94685次浏览 1252人参与
# 我的实习日记 #
2426345次浏览 25330人参与
# 晒一晒你收到的礼盒 #
60966次浏览 367人参与
# 选offer应该考虑哪些因素 #
14287次浏览 232人参与
# 第一份工作应该只看薪资吗 #
137930次浏览 1454人参与
# 牛客十周岁生日快乐 #
129045次浏览 1515人参与
# 你怀疑过自己的专业选择吗? #
17063次浏览 201人参与
# 在国企工作的人,躺平了吗? #
327080次浏览 3840人参与
# 你想留在一线还是回老家? #
37110次浏览 445人参与
# 为了秋招你都做了哪些准备? #
10288次浏览 151人参与
# 秋招想进国企该如何准备 #
57260次浏览 372人参与
# 你小时候最想从事什么职业 #
90820次浏览 1698人参与
# 你们公司哪个部门最累? #
15209次浏览 130人参与
# 工作后会跟朋友渐行渐远吗 #
21055次浏览 167人参与
# 速腾聚创求职进展汇总 #
30531次浏览 229人参与
# 产品实习,你更倾向大公司or小公司 #
146394次浏览 1909人参与
# 薪资爆料 #
102711次浏览 1042人参与