'''
解题思路:
1、中缀表达式转为后缀表达式
2、为后缀表达式计算规则:从左到右遍历表达式的每个数字和符号,遇到的是数字就进栈,
遇到的时符号就将栈顶的两个数字出栈进行计算,然后将计算结果入栈,最终栈里的值即为计算的结果。
3、预处理:将字符串按实际物理意义,转成字符列表(含多位数和负数、空格、[]、{})
'''
#----------------------------------------
# 输出num1 + operator + num2结果
def getvalue(num1,num2,operator):
if operator == '+':
return num1 + num2
elif operator == '-':
return num1 - num2
elif operator == '*':
return num1 * num2
elif operator == '/':
return num1 / num2
else:
return []
#----------------------------------------
# 优先级 operator1 >= operator2,输出真
def compare(operator1,operator2):
if operator1 in '*/' and operator1 in '*/':
return True
elif operator1 in '+-' and operator1 in '+-':
return True
elif operator1 in '*/' and operator1 in '+-':
return True
elif operator1 in '+-' and operator1 in '*/':
return False
else:
return []
#----------------------------------------
# 中缀表达式转为后缀表达式
# 输入L = ['0','-','1','*','(','0','-','1','-','1',')','-','3','*','(','1','-','2',')','-','3','*','4']
# 输出express= ['0',1','0','1','-','1','-','*','-','3','1','2','-','*','-','3','4','*','-']
def suffix_express(L):
express = [] # 后缀表达式
stack = [] # 存中间符号的栈
for i in L:
if i.isnumeric(): # 数字直接入表达式
express.append(i)
elif i in '+-': # 遇到+—号,如果符号栈空,入符号栈
if len(stack) == 0:
stack.append(i)
else: # 如果符号栈不为空,符号栈优先级大于等于当前符号的,弹出入表达式
while stack and compare(stack[-1],i):
express.append(stack.pop())
stack.append(i) # 当前符号入符号栈
elif i in '*/(': # */(直接入符号栈
stack.append(i)
elif i in ')': # 遇到),(之前的符号弹出入表达式
while stack and stack[-1] != '(':
express.append(stack.pop())
if stack: # 删除(
stack.pop()
while stack: # 最后栈中所有符号弹出入表达式
express.append(stack.pop())
return express
#----------------------------------------
# 为后缀表达式计算规则:
# 从左到右遍历表达式的每个数字和符号,遇到的是数字就进栈,遇到的时符号就将栈顶的两个数字出栈进行计算,
# 然后将计算结果入栈,最终栈里的值即为计算的结果。
# 输入express= ['0',1','0','1','-','1','-','*','-','3','1','2','-','*','-','3','4','*','-']
# 输出计算结果 = result
def compute(suffix_express):
stack = []
for i in suffix_express:
if i.isnumeric():
stack.append(i)
elif i in '+-*/':
n2 = stack.pop()
n1 = stack.pop()
stack.append(getvalue(int(n1),int(n2),i))
if stack:
return stack.pop()
return []
#----------------------------------------
# 预处理:将字符串按实际物理意义,转成字符列表(含多位数和负数、空格、[]、{})
# 输入:-1*(-1-1)-3*(1-2)-3*4
# 输出:['0','-','1','*','(','0','-','1','-','1',')','-','3','*','(','1','-','2',')','-','3','*','4']
def preprocess(L):
B = ''
for i in L:
if i in '0123456789+-*/()[]{}': # 去空格
B += i
B = B.replace('[','(') # 统一括号
B = B.replace(']',')')
B = B.replace('{','(')
B = B.replace('}',')')
L = '('+ B +')' # 左右加括号用于判断负号
A = []
tmp = ''
for i in range(1,len(L)-1):
if L[i] == '-' and L[i-1]=='(': # 负号前必有括号,前加0将负号变减号
A.append('0')
A.append('-')
elif L[i].isnumeric() and L[i+1].isnumeric():
tmp += L[i]
elif L[i].isnumeric() and not L[i+1].isnumeric():
tmp += L[i]
A.append(tmp)
tmp = ''
else:
A.append(L[i])
return A
String = input()
#String = '-1*(-1-1)-3*(1-2)-3*4'
#print(String)
List = preprocess(String)
#print(List)
express = suffix_express(List)
#print(express)
result = compute(express)
print(result)