首先在看到这道题的时候,第一印象应该是要用 栈 去实现,同时还感觉需要用到 指针 但是在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,就只能这样了
