题解 | #四则运算# 使用栈将表达式转为后序表达式并计算

四则运算

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

from operator import pos
def infixToPostfix(S):
    precedences = {'+':1, '-':1, '*':2, '/':2}
    postfix = []
    operators = []
    for i,s in enumerate(S):
        if s.isdigit():
            if i > 0 and S[i-1].isdigit():
                postfix[-1] += s
            else:
                postfix.append(s)
        elif s in '{[(':
            operators.append(s)
        elif s in ')]}':
            while operators[-1] not in '{[(':
                postfix.append(operators.pop())
            operators.pop()
        else:
            if s == '-' and S[i-1] in '{[(':
                postfix.append('0')
            while operators and precedences.get(operators[-1], 0)>=precedences[s]:
                postfix.append(operators.pop())
            operators.append(s)
    while operators: postfix.append(operators.pop())
    
    return postfix

def calPostfix(S):
    nums = []
    for s in S:
        if s.isdigit():
            nums.append(int(s))
        else:
            if s == '+':
                num1, num2 = nums.pop(), nums.pop()
                nums.append(num1+num2)
            if s == '-':
                num1, num2 = nums.pop(), nums.pop()
                nums.append(num2-num1)
            if s == '*':
                num1, num2 = nums.pop(), nums.pop()
                nums.append(num1*num2)
            if s == '/':
                num1, num2 = nums.pop(), nums.pop()
                nums.append(num2/num1)
    return int(nums[0])

while True:
    try:
        S = input()
    except:
        break
    postfix = infixToPostfix(S)
    print(calPostfix(postfix))

全部评论

相关推荐

想玩飞盘的菠萝蜜在春...:上交✌🏻也拒?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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