题解 | #四则运算#

四则运算

http://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e

# 将输入的表达式中的数字和符号区分开,并保存到列表中
def group(s):
    num, res = '', []
    for i, c in enumerate(s):
        if c.isdigit():
            num += c # 数字可能有很多位数
        else:
            if num:
                res.append(num)
                num = ''
            if c == '-': # 负数的判断
                if (i == 0) or (s[i-1] in '+-*/([{'):
                    num += c
                    continue
            res.append(c)
    if num:
        res.append(num)
    return res

while True:
    try:
        s = input()
        lst = group(s)
        stack_n, stack_op = [], []
        '''
            遍历数字和符号列表lst:
            1.如果遇到数字,添加到数字栈stack_n中;
            2.如果遇到*/([{这些符号,直接添加到符号栈stack_op中;
            3.如果遇到+-号:
                (1).如果符号栈stack_op为空或栈顶元素是左括号([{的话,直接入栈;
                (2).如果符号栈stack_op不为空,则不断从符号栈stack_op中弹出一个符号,
                    同时从数字栈stack_n中弹出两个数字进行运算,并将运算结果保存到数字栈stack_n中。
                    期间若遇到左括号([{,则跳出循环,最后再将加号+或者减号-添加到符号栈中。
            4.如果遇到右括号)]},在栈顶元素不是左括号([{之前,不断地取出数字和符号进行运算,
              同时将结果保存到数字栈stack_n中,最后删除左括号。
        '''
        for i in lst:
            if i not in '+-*/()[]{}': # 数字
                stack_n.append(i)
            elif i in '*/([{':
                stack_op.append(i)
            elif i in '+-':
                if len(stack_op) == 0 or stack_op[-1] in '([{':
                    stack_op.append(i)
                else:
                    while stack_op:
                        if stack_op[-1] in '([{':
                            break
                        op = stack_op.pop()
                        n2, n1 = stack_n.pop(), stack_n.pop()
                        stack_n.append(str(eval(n1 + op + n2)))
                    stack_op.append(i)
            elif i in ')]}':
                while stack_op[-1] not in '([{':
                    op = stack_op.pop()
                    n2, n1 = stack_n.pop(), stack_n.pop()
                    stack_n.append(str(int(eval(n1 + op + n2))))
                stack_op.pop()
        # 对数字栈和符号栈中剩余元素进行运算
        while stack_op:
            op = stack_op.pop()
            n2, n1 = stack_n.pop(), stack_n.pop()
            stack_n.append(str(int(eval(n1 + op + n2))))
        # 弹出并打印数字栈中最后一个数字,即运算结果
        print(stack_n.pop())
    except:
        break
全部评论
这代码有点问题。比如(8/4*2)+7得到的结果是8,应该是11
4 回复 分享
发布于 2022-05-15 23:40
栈的思路很好,但是我有个问题,代码中可以使用eval()么?如果可以使用eval(),一步到位不就好了?
2 回复 分享
发布于 2022-07-27 23:50
(3)中,遇到+-号时,后面说“期间若遇到左括号([{,则跳出循环”,不明白这里为啥呀跳出循环
点赞 回复 分享
发布于 2021-10-30 20:12
想得有点复杂了兄弟
点赞 回复 分享
发布于 2022-04-11 21:57
这才是正常答案吧, 直接replace的考试应该不会过吧
点赞 回复 分享
发布于 2022-04-19 09:56

相关推荐

鼗:四级有点难绷,感觉能拿国家励志奖学金,学习能力应该蛮强的,四级确实不重要,但是拿这个卡你可是很恶心啊
点赞 评论 收藏
分享
25 5 评论
分享
牛客网
牛客企业服务