题解 | #四则运算#
四则运算
https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
#不替换也可以,那么下面就不写='(',而是写in ['(','{','[']这些。 a = input().replace('[','(').replace('{','(').replace(']',')').replace('}',')') #前后加括号,因为下面的计算是基于只要遇到一个')'的符号,就把这个括号内的表达式计算出一个值, #然后加到上一个表达式的末尾,前后加括号是为了:当原本表达式的所有括号都处理之后,最后整个表达式也进行了计算。 b = '(' + a + ')' #c将用来保存所有括号内的信息,比如第一个'('和第二个'('之间的内容就作为c的第一个元素, #而第二个'('和第三个'('之间的内容就作为c的第二个元素。当然了,这里给c初始化的时候第一个元素直接 #赋值为空列表,这是因为如上面所说,遇到最后一个')'的时候,会把计算出来的值加到上一个表达式的末尾(c[-1]),所以必须留一个空的列表来填值。 c = [[]] i = 0 while i < len(b): if b[i] == '(': c.append([]) i += 1 continue if b[i] in ['+','-','*','/']: c[-1].append(b[i]) i += 1 continue if ord('0') <= ord(b[i]) <= ord('9'): j = i+1 while (j < len(b)) and (ord('0') <= ord(b[j]) <= ord('9')): j += 1 c[-1].append(int(b[i:j])) i = j continue if b[i] == ')': d = c.pop(-1) e = [] k = 0 while k < len(d): if d[k] == '*': e[-1] = e[-1] * d[k+1] k += 2 continue elif d[k] == '/': e[-1] = e[-1] / d[k+1] k += 2 continue else: e.append(d[k]) k += 1 continue #这里需要判断,当表达式是类似(-3*1)或者(-3)这样的形式时,改成(0-3*1)或者(0-3)的形式。 if e[0] == '-': e = [0] + e #要先给num赋一个值,因为表达式如(3)的时候,里面没有加减乘除,但是仍然可以取到值。 num = e[0] k = 0 while k < len(e): if e[k] == '+': num = num + e[k+1] k += 2 continue if e[k] == '-': num = num - e[k+1] k += 2 continue k += 1 c[-1].append(num) i += 1 continue print(int(num))