CCF-201903-2-二十四点

模拟二十四点游戏,本质就是让你求中缀表达式。
我这里用栈解题,两个栈,一个数字栈,一个操作符栈。
读取到表达式后,顺序读取字符,
遇到操作符压进操作符栈,
遇到数字,看前一个操作是否是乘除,是就弹出前一个数字和前一个操作符,前一个数字和当前数字计算完后再压回数字栈。注意,因为第一个数字前面没有操作符,所以第一个数字直接就压进数字栈,不用判断前一个操作符。
最后在按顺序把栈中的数字按符号相加减。
细节:题目中的除法为整除

python代码

n = int(input())
for i in range(n):
    expt = input()
    opStack, numsStack = [], []

    for c in expt:
        # 遇到操作符
        if c == '+' or c == '-' or c == 'x' or c == '/':
            opStack.append(c)
        # 遇到数字且栈非空
        elif opStack:
            if opStack[-1] == 'x':
                op = opStack.pop()
                preNum = numsStack.pop()
                numsStack.append(preNum * int(c))
            elif opStack[-1] == '/':
                op = opStack.pop()
                preNum = numsStack.pop()
                numsStack.append(preNum // int(c))
            else:
                numsStack.append(int(c))
        # 遇到数字且栈空
        else:
            numsStack.append(int(c))
    for option in opStack:
        pre = numsStack.pop(0)
        last = numsStack.pop(0)
        numsStack.insert(0, pre + last if option == '+' else pre - last)
    print('Yes') if numsStack[-1] == 24 else print('No')

# 10
# 9+3+4x3
# 5+4x5x5
# 7-9-9+8
# 5x6/5x4
# 3+5+7+9
# 1x1+9-9
# 1x9-5/9
# 8/5+6x9
# 6x7-3x6
# 6x4+4/5

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值