题解 | #四则运算#

四则运算

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

Python3 逆波兰方法求解四则运算

a = input()
for ch in a:
    if ch in '[{':
        a = a.replace(ch,'(')
    elif ch in '}]':
        a = a.replace(ch,')')

b = [' ']  # 存储四则运算符号(栈)
c = []  # 存储输出的后缀表达式
d = {'*': 3, '/': 3, '+': 2, '-': 2, ' ': 1}  # 字典存储优先级
flag = 0
for i in range(len(a)):
    if a[i] == '-':
        if i == 0: # 如果'-'为负号,跳出该次循环,flag = 1
            flag = 1
            continue
        elif a[i-1] in '(':
            flag = 1
            continue
    elif 48 <= ord(a[i]) <= 57:   #如果上一个字符也是数字,直接跳出此次循环
        if i == 0:
            pass
        elif 48 <= ord(a[i-1]) <= 57:
            continue
    if 48 <= ord(a[i]) <= 57:  # 数字直接输出
        num = a[i]
        if i != len(a)-1:
            j = 1
            while i+j < len(a):
                if 48 <= ord(a[i + j]) <= 57:
                    num += a[i+j]
                    j = j+1
                break
        if flag == 1:
            c.append('-' + num)
            flag = 0
        else:
            c.append(num)
    elif a[i] == ')':  # 右括号,栈顶元素出栈输出,直到遇到左括号或栈空为止
        while b[-1] != ' ' and b[-1] != '(':
            c.append(b.pop())
        if b[-1] == '(':
            b.pop()
    elif a[i] == '(' or b[-1] == '(':  # 符号为'('或栈顶为'(',则直接入栈
        b.append(a[i])
    elif d[a[i]] > d[b[-1]]:   # 优先级高,直接入栈
        b.append(a[i])
    else:  # 优先级比栈顶元素低,则出栈,直到比栈顶元素优先级高或栈空
        while d[a[i]] <= d[b[-1]] and b[-1] != ' ':
            c.append(b.pop())
            if b[-1] == '(':
                break
        b.append(a[i])
if len(b) > 1:
    for i in range(1,len(b)):
        c.append(b.pop())

b = []     # 存放数字
for ch in c:
    if len(ch) > 1:
        b.append(eval(ch))
    elif 48 <= ord(ch) <= 57:     #如果是数字,进栈
        b.append(eval(ch))
    else:
        x1 = b.pop()
        x2 = b.pop()
        if ch == '+':
            m = x2 + x1
        elif ch == '-':
            m = x2 - x1
        elif ch == '*':
            m = x2 * x1
        else:
            m = x2 /x1
        b.append(m)
print(b[0])
全部评论

相关推荐

09-12 19:04
门头沟学院 Java
大厂offer快快快来:虽然很想感谢你的分享,但是此刻的嫉妒和酸气已经涌上心头,所以我撤销一下对你的感谢吧,希望你能原谅我恭喜!
点赞 评论 收藏
分享
08-25 17:07
门头沟学院 C++
西南山:面向结果编程
查看4道真题和解析 投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务