题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 返回表达式的值
# @param s string字符串 待计算的表达式
# @return int整型
#
import re
class Solution:
def cal(self,signs,nums):
# 注意该运算为倒序运算,需要进行符号转换
s=signs.pop(-1)
num2=nums.pop(-1)
num1=nums.pop(-1)
if s=="+":
nums.append(int(num1+num2))
elif s=="-":
if signs and signs[-1]=="-":
nums.append(int(num1+num2))
else:
nums.append(int(num1-num2))
elif s=="*":
if signs and signs[-1]=="/":
nums.append(int(num1*(1/num2)))
else:
nums.append(int(num1*num2))
elif s=="/":
nums.append(int(num1/num2))
def solve(self , s: str) -> int:
# write code here
pattern=r'([-+*/()])|(\d+)'
tokens=re.findall(pattern,s)
tokens = [token for token in sum(tokens, ()) if token.strip() != '']
nums=[]
signs=[]
for i in tokens:
if i.isdigit():
nums.append(int(i))
elif signs and i in "+-" and signs[-1] in "*/":
# 遇到高等级的运算,先计算高等级运算,直到遇到左括号
while signs and signs[-1]!="(":
self.cal(signs,nums)
signs.append(i)
elif i==")":
# 计算结果直到遇到左括号,弹出左括号后停止
while signs[-1]!="(":
self.cal(signs,nums)
signs.pop(-1)
else:
signs.append(i)
# 此循环结束后括号全部被消除,得到无括号的表达式
while signs:
self.cal(signs,nums)
return nums[-1]

