KY102 计算表达式

KY102 计算表达式

import sys
# 7 / 9 / 10 * 1 * 4 / 6 - 3 * 9 - 8 - 7
priority = {'+' : 0, "-" : 0, "*" : 1, "/" : 1}
def printEvaluation(line):
    # line = line.split(' ')  # 去除多余空格
    opStack, numStack = list(), list()  # 操作符, 操作数
    for c in line:
        if c not in priority:  # 是数字
            numStack.append(c)  # 放入操作数
        else:  
            # 取运算符                                      
            if len(opStack)==0:  # 不含运算符
                opStack.append(c)  # 放入运算符
            elif priority[opStack[-1]]>=priority[c]:
                lastOp = opStack.pop()  # 运算符
                b = numStack.pop()
                a = numStack.pop()
                res = str(eval(a+lastOp+b))  # 执行加减乘除
                numStack.append(res)
                if len(opStack)==0:
                    opStack.append(c)  # 添加运算符
                elif priority[opStack[-1]]>=priority[c]:
                    lastOp = opStack.pop()  # 运算符
                    b = numStack.pop()
                    a = numStack.pop()
                    res = str(eval(a+lastOp+b))  # 执行加减乘除
                    numStack.append(res)
                    opStack.append(c)  # 添加运算符
                else:
                    opStack.append(c)  # 添加运算符
            else:
                opStack.append(c)  # 添加运算符
    while len(opStack)!=0:  # 含有运算符
        lastOp = opStack.pop()  # 取出运算符
        b = numStack.pop()
        a = numStack.pop()  
        res = str(eval(a+lastOp+b))  # 执行加减乘除
        numStack.append(res)      
    print(int(eval(numStack.pop())))

for line in sys.stdin:
    line = line.strip()
    ops = {"/","*","-","+"}
    items = list()
    start = 0
    for i in range(len(line)):
        if line[i] in ops:
            items.append(line[start:i])
            items.append(line[i])
            start = i + 1
    items.append(line[start:])
    printEvaluation(items)

# 4 * 8 / 4 / 7 + 10 - 3 / 1 / 4 * 1 * 3
import sys

for line in sys.stdin:
    line = line.strip()
    print(int(eval(line)))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值