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,就只能这样了

posted @ 2020-07-04 20:56  博0_oer~  阅读(17)  评论(0编辑  收藏  举报