CCF认证模拟-201903-2-二十四点-python
题目
思路
首先在看到这道题的时候,第一印象应该是要用 栈 去实现,同时还感觉需要用到 指针
但是在python中没有指针的概念,为了便于理解,我在代码中设置了一个数字列表,姑且叫他 ”指针数列“ ,以便模拟指针的作用
当然这道题也可以用数据结构中后缀表达式的概念去理解
下面是一个后缀表达式的例子,也可以作为一种思路(不过我没有去写这种思路的代码):
在本题中没有使用 小括号 ,无形中降低了难度
我的解题思路如下:
先乘除后加减 这个是核心思路
先进行乘除运算的思路如下:
这里应该理解成一个 栈 的概念
设置一个数字栈,和一个符号栈,在对表达式进行遍历的过程中,当遇到数字,则进入数字栈,当遇到 “+” 和 “-” 运算符,则进入符号栈,在遇到 “x” 和 “/” 运算符时,将数字栈中的最后一个元素出栈,与 “x” 和 “/” 运算符的后一位数字进行运算,并将运算结果入数字栈。此时因为python没有指针的缘故,为了不进行表达式中下一数字的循环,在之前设置的 “指针数列” 中将其位置的值置为 -1,以便不执行这一位的循环。
在执行玩乘除运算后,相当于只剩下了一个加减运算的式子
后进行加减运算的思路如下:
这里可以理解位应该 队列 的概念
先将数字栈进行逆序操作,因为逆序以后可以保证出栈顺序和队列的输出顺序一致;至于符号栈不需要逆序,是因为可以直接对符号栈进行遍历,也相当于先进先出的队列思想
代码示例
同样,代码绝对不是最优解,只能保证得分为100,但是思路应该是比较简单的
a = int(input())
b = []
for i in range(a):
b.append(input())
for i in b:
number = []
symbol = []
# q列表的作用是模拟实现指针,用于指示表达式的各位
q = [0, 1, 2, 3, 4, 5, 6]
for j in q:
if j != -1:
if i[j].isdigit():
number.append(i[j])
# 此处需要注意:乘运算使用"x” 而不是"*"
elif i[j] == 'x':
x = int(number.pop())
y = int(i[j+1])
number.append(int(x*y))
q[j+1] = -1
elif i[j] == '/':
x = int(number.pop())
y = int(i[j + 1])
number.append(int(x/y))
q[j+1] = -1
else:
symbol.append(i[j])
# 将列表进行逆序
number.reverse()
for s in symbol:
if s == '+':
x = int(number.pop())
y = int(number.pop())
number.append(int(x+y))
elif s == '-':
x = int(number.pop())
y = int(number.pop())
number.append(int(x-y))
if int(number.pop()) == 24:
print("Yes")
else:
print("No")
这道题是对数据结构栈和队列思路的考察,我个人认为使用C语言应该会更好理解,当然这里我是在练习python,就只能这样了