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