题解 | #四则运算#

四则运算

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
这才是正常答案吧, 直接replace的考试应该不会过吧
点赞 回复 分享
发布于 2022-04-19 09:56
想得有点复杂了兄弟
点赞 回复 分享
发布于 2022-04-11 21:57
(3)中,遇到+-号时,后面说“期间若遇到左括号([{,则跳出循环”,不明白这里为啥呀跳出循环
点赞 回复 分享
发布于 2021-10-30 20:12

相关推荐

就前几天旅游的时候,打开抖音就经常刷到这类视频:以前是高学历学生、老师、主持人,现在做着团播、擦边主播的工作,以及那些经过精心包装的“职业转型”故事——从铺天盖地的VLOG到所谓的“04年夜场工作日记”,这些内容在初中升学、高考放榜等关键时间节点持续发酵。可以说非常直接且精准地在潜移默化地影响着心智尚未成熟的青少年,使其对特殊行业逐渐脱敏。那我就想问了:某些传播公司、平台运营者甚至某些夜场的老板,你们究竟在传递怎样的价值观?点开那些视频,评论区里也是呈现明显的两极分化:一种是​​经济下行论​​:“现在就业市场已经艰难到这种程度了吗?”​​一种是事实反驳派​​:这些创作者往往拥有名校背景,从事着...
牛客刘北:被环境教育的,为了能拿到足够的钱养活自己,不甘心也得甘心,现在的短视频传播的思想的确很扭曲,但是很明显,互联网玩上一年你就能全款提A6,但你全心全意不吃不喝工作一年未必能提A6,但是在高考中考出现这个的确很扭曲,在向大家传播“不上学,玩互联网也可以轻松年入百万”,不是人变了,是社会在变
预测一下26届秋招形势
点赞 评论 收藏
分享
06-12 10:50
门头沟学院 Java
你的不定积分没加C:我怎么在学院群看到了同样的话
点赞 评论 收藏
分享
评论
25
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务