#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 返回表达式的值
# @param s string字符串 待计算的表达式
# @return int整型
#
class Solution:
def solve(self , s: str) -> int:
# write code here
priority = {
'+' : 1,
'-' : 1,
'*' : 2,
}
#优先级高的操作符压入操作符栈;优先级相等、低的操作符,弹出栈顶操作符,并计算;
z_num = []
z_op = []
num = ''
i=0
while i < len(s):
ch = s[i]
if ch == '(':
z_op.append(ch)
elif ch not in '+-*)':
num = ''
while i<len(s) and s[i].isdigit():
num += s[i]
i += 1
z_num.append(int(num))
continue
#如果是“)”,一直计算到“(”为止;计算括号内的
elif ch == ')':
while z_op and z_op[-1] != '(' :
op = z_op.pop()
b = z_num.pop()
a = z_num.pop()
z_num.append(self.apply(a,b,op))
z_op.pop() #弹出“(”
# 若ch优先级<= 栈顶操作符优先级,则一直计算到 >栈顶操作符优先级 或“(”出现
#如果操作符栈为空,或ch优先级比栈顶操作符优先级高,则压入栈中。
else:
while len(z_op) != 0 and z_op[-1] != '(' and priority[ch] <= priority[z_op[-1]]:
op = z_op.pop()
b = z_num.pop()
a = z_num.pop()
z_num.append(self.apply(a,b,op))
z_op.append(ch)
i += 1
#遍历完字符串后,若操作符栈不为空,则继续计算
while z_op:
op = z_op.pop()
b = z_num.pop()
a = z_num.pop()
z_num.append(self.apply(a,b,op))
return z_num[-1]
def apply(self,a:int,b:int,op:chr) -> int:
if op == '+':
return a+b
elif op == "-":
return a-b
elif op == '*':
return a*b
return 0