给定一个字符串描述的算术表达式,计算出结果值。
输入字符串长度不超过 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