输入算数表达式,识别运算符和括号,并根据优先级进行运算
#print(eval(input()))
#dataL存放数字,opL存放符号,此函数处理数字计算和出栈。一开始,opL先压进一个左括号
def yunsuan(dataL,opL):
result = 0 #运算结果
num = dataL[-1] #数字栈的栈顶,如果是分母则会出现分母为0的错误
dataL.pop() #取到栈顶后弹出栈顶
num2 = dataL[-1] #再取一个栈顶的数字
dataL.pop() #再弹出
op = opL[-1] #取到符号栈的栈顶
opL.pop() #弹出符号栈顶
#下面判断符号,进行运算
if op == "+":
result = num + num2
elif op == "-":
result = num2 - num
elif op == "*":
result = num * num2
elif op == "/":
result = num2 / num
dataL.append(result) #把运算结果压入栈
return
#opDangqian是字符串中当前的符号,opL是符号栈,此函数判断符号的优先级,但不做出入栈的操作
#如果当前符号优先级高于符号栈顶的优先级,则不做运算,符号压入栈,返回False
#若当前符号优先级等于或低于符号栈顶的优先级,则做运算,符号栈顶出栈,返回True
def youxianji(opDangqian,opL):
op = opL[-1] #取到栈顶的符号
if op == '(' or op == '[' or op == '{':
#若栈顶是左括号,无法运算,返回False
return False
elif (op == '+' or op == '-') and (opDangqian == '*' or opDangqian == '/'):
#若栈顶是加减,当前是乘除,当前优先高于栈顶,不做运算,把乘除压入栈
return False
else:
return True #其他情况均出栈做运算,返回True
#下面是主操作流程
l = input()
l = l + ')' #在字符串最后加右括号,便于尾部操作
dataL = [] #存放数字
opL = [] #存放符号
opL.append('(') #符号栈底加个左括号,便于头部操作
fuhaoList = ["+","-","*","/",")","}","]"] #枚举数字右侧可能出现的符号,用于取多位数的整数
nextIsOp = False #标志位,判断下一个字符是否为符号
i = 0 #下标
while i < len(l): #最后一位是右括号,忽略
if l[i] == "(" or l[i] == "[" or l[i] == "{": #判断如是左括号,入栈
opL.append(l[i])
i += 1
elif l[i] == ")" or l[i] == "]" or l[i] == "}": #判断若字符串中是右括号,则判断符号栈顶是否为左括号
while opL[-1] != "(" and opL[-1] != "[" and opL[-1] != "{": #若栈顶不是左括号,则判断当前右括号和符号栈顶的优先级
if youxianji(l[i],opL): #判断当前右括号和符号栈顶的优先级,因为while已经判断了栈顶不是左括号,所以这里一定为真
yunsuan(dataL,opL) #做运算,之后更新栈顶,while循环判断符号栈顶能否遇到左括号
opL.pop() #栈顶遇到左括号后while结束,弹出栈顶的左括号,继续判断下一个字符
i += 1
elif nextIsOp: #若下一个字符为符号,nextIsOp为true,进行运算,即判断是否为+-*/
while youxianji(l[i], opL): #优先级为真,则需要运算,直到遇到高优先级的字符
yunsuan(dataL, opL)
opL.append(l[i]) #将高优先级的符号入栈
nextIsOp = False
i += 1
else: #这里就是处理数字,没有遇到符号的时候
j = i
if l[j] == "-":
i+=1
while l[i] not in fuhaoList:
i += 1
dataL.append(int(l[j:i]))
nextIsOp = True
print(dataL[0])