题解 | #四则运算#

四则运算

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))

全部评论

相关推荐

牛客717484937号:双飞硕没实习挺要命的
点赞 评论 收藏
分享
死在JAVA的王小美:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,我也是,让我免了一轮,但是硬气拒绝了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务