题解 | #四则运算#

四则运算

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])
全部评论

相关推荐

07-02 10:44
门头沟学院 C++
码农索隆:太实诚了,告诉hr,你能实习至少6个月
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-01 17:13
想去,但是听说加班强度实在难崩,所以拒绝了,现在有点心梗对面hr感觉也是实习生,打电话的时候怪紧张的,但是感觉人很好嘞
水中水之下水道的鼠鼠:哥们这不先去体验一下,不行再跑呗,大不了混个实习经历(有更好的转正offer就当我没说)
点赞 评论 收藏
分享
05-25 10:45
门头沟学院 Java
Frank_zhan...:没实习一个项目肯定不够,可以再做一个轮子,技术栈再补一个mq,微服务,整体再换个简历模板,暑期尽量再找一个日常实习
无实习如何秋招上岸
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

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