题解 | #四则运算#

四则运算

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

# 输入
string = input()
arr = []
for i in string:
    # 遇到数字
    if '0' <= i <= '9':
        # 判断前面是否数字,是否需要拼接
        if len(arr) > 0 and '0' <= arr[-1] <= '9':
            arr[-1] = arr[-1] + i
        else:
            arr.append(i)
    # 遇到非数字,直接加入
    else:
        if i == '-':
            # 如果如果是负数,则补0
            if len(arr) == 0:
                arr.append('0')
                arr.append(i)
            elif arr[-1] in "({[":
                arr.append('0')
                arr.append(i)
            else:
                arr.append(i)
        else:
            arr.append(i)
# 两个栈,一个存储运算符,一个存储数字
stack1,stack2,i = [],[],0
while i < len(arr):
    # 遇到左括号,直接入栈
    if  arr[i] in "({[":
        stack1.append(arr[i])
    # 遇到右括号,依次弹出符号栈,直到左括号为止
    elif arr[i] in ")}]":
        while True:
            temp = stack1.pop()
            if temp in "({[":
                break
            else:
                a = stack2.pop()
                b = stack2.pop()
                if temp == '+':
                    stack2.append(b+a)
                elif temp == '-':
                    stack2.append(b-a)
                elif temp == '*':
                    stack2.append(b*a)
                else:
                    stack2.append(int(b/a))
    # 遇到运算符,判断优先级
    elif arr[i] in "+-*/":
        # 如果stack1只有一个元素,直接加入
        if not stack1:
            stack1.append(arr[i])
        else:
            # 弹出stack1中所有大于当前运算符的运算符 
            while True:
                if len(stack1) == 0:
                    stack1.append(arr[i])
                    break
                temp = stack1[-1]
                if temp in "({[" :
                    stack1.append(arr[i])
                    break
                # 乘除,直接计算
                elif temp in "*/":
                    temp = stack1.pop()
                    a = stack2.pop()
                    b = stack2.pop()
                    if temp == '*':
                        stack2.append(b*a)
                    elif temp == '/':
                        stack2.append(int(b/a))
                # 加减,看当前元素是否也是加减
                else:
                    if arr[i] in "+-":
                        temp = stack1.pop()
                        a = stack2.pop()
                        b = stack2.pop()
                        if temp == '+':
                            stack2.append(b+a)
                        elif temp == '-':
                            stack2.append(b-a)
                        stack1.append(arr[i])
                    else:
                        stack1.append(arr[i])
                    break
    # 遇到数字,直接加入
    else:
        stack2.append(int(arr[i]))
    i += 1
# 若 stack1还存在运算符,依次弹出
while stack1:
    temp = stack1.pop()
    a = stack2.pop()
    b = stack2.pop()
    if temp == '+':
        stack2.append(b+a)
    elif temp == '-':
        stack2.append(b-a)
    elif temp == '*':
        stack2.append(b*a)
    else:
        stack2.append(int(b/a))
# 输出结果
print(stack2.pop())

    
    
    
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-03 17:30
点赞 评论 收藏
分享
05-20 13:59
门头沟学院 Java
米黑子米黑子:你这个成绩不争取下保研?
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-03 18:22
投了几百份简历,专业和方向完全对口,都已读不回。尝试改了一下学校,果然有奇效。
steelhead:这不是很正常嘛,BOSS好的是即便是你学院本可能都会和聊几句,牛客上学院本机会很少了
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

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