给定一个字符串描述的算术表达式,计算出结果值。
输入字符串长度不超过 100 ,合法的字符包括 ”+, -, *, /, (, )” , ”0-9” 。
数据范围:运算过程中和最终结果均满足
,即只进行整型运算,确保输入的表达式合法
问题:如何判断'-'是减号还是负号? 例如 -1*(-1-1) -2*(-1+3)(1-2)-3*4
解答:如果前一个字符是 数字 或者 右括号时,是减号。其余是负号
def fun(m,n,s):
if s=='*':
return n*m
if s=='/':
return n/m
if s=='+':
return n+m
if s=='-':
return n-m
while True:
try:
ss=input().strip()
digit=[]
do=[]
ss='('+ss+')'
dd={'*':1,'/':1,'+':0,'-':0,'(':-1}
i=0
while i < len(ss):
s=ss[i]
if s.isdigit():#当前为数字直接入栈
i=i+1
while ss[i].isdigit():#数字是多个字符的
s=s+ss[i]
i=i+1
digit.append(int(s))
elif s in dd.keys() and s!='(':# 当前为运算符
do_pre=do[-1]
if s=='-' :# 判断是减号 还是负号
if (ss[i-1].isdigit()&nbs***bsp;ss[i-1] in ['}',']',')']):# 是减号时,进行优先级判断并做运算
while dd[s]<=dd[do_pre]:
result0=fun(digit.pop(),digit.pop(),do.pop())
digit.append(result0)
do_pre=do[-1]
do.append(s)
i=i+1
else:# 是负号,将负数入栈
i=i+1
s0=''
while ss[i].isdigit():
s0=s0+ss[i]
i=i+1
digit.append(-int(s0))
else:# 除了减号之外的运算符,进行优先级判断并计算,直到当前符号优先级高于栈顶
while dd[s]<=dd[do_pre]:
result0=fun(digit.pop(),digit.pop(),do.pop())
digit.append(result0)
do_pre=do[-1]
do.append(s)
i=i+1
elif s in ['{','[','(']:#左括号直接入栈
do.append(s)
i=i+1
elif s in ['}',']',')']:#遇到右括号,进行计算,直到遇到左括号为止,将计算结果入栈
i=i+1
do_now=do.pop()
while do_now not in ['{','[','(']:
result0=fun(digit.pop(),digit.pop(),do_now)
digit.append(result0)
do_now=do.pop()
print(digit[0])
except:
break
import re
prio = {
"(": 0,
"+": 1,
"-": 1,
"*": 2,
"/": 2
}
def pre_process(s):
return re.sub(r"(?<![0-9\)])(?=-[0-9\()])", r"0", s)
def pop_and_cal(op, data):
o, b, a = op.pop(), data.pop(), data.pop()
if o == "+":
data.append(a+b)
elif o == "-":
data.append(a-b)
elif o == "*":
data.append(a*b)
else:
data.append(a/b)
def cal(exp):
i, op, data = 0, [], []
while i < len(exp):
c = exp[i]
if c.isdigit():
j = i+1
for j in range(i+1, len(exp)):
if not exp[j].isdigit():
break
data.append(int( exp[i:j] ))
i = j
continue
elif not op:
op.append(c)
elif c == "(":
op.append(c)
elif c == ")":
while op[-1] != "(":
pop_and_cal(op, data)
op.pop()
else:
while op and prio[op[-1]] >= prio[c]:
pop_and_cal(op, data)
op.append(c)
i += 1
while op:
pop_and_cal(op, data)
return data[0]
s = input()
exp = pre_process(s)
print(cal(exp)) while True: try: math = input() print(eval(math)) except: break