CCF201903-2二十四点

 

 思路描述:最开始的思路是拿一个栈来存储数据和符号,在动手实践的过程中发现行不通,单个数字的char和int转换可以,但是加起来的数据两位数字就很难处理了。

然后就去看了看别人的思路,给了我一个很好的启发就是把数据和符号分开存储,但是在处理减号时思路再次打乱,突然就想到了双端队列

整理后的思路如下:(可能思路和我卡在同一个地方的更容易看明白我在说啥,尽量想让博客写的更容易理解些,会努力加油的!)

贴下代码:

#include<iostream>
#include<cstring>#include<deque>

using namespace std;

deque<int> num;//数据队列
deque<char> sign;//符号队列

int main() {
    int n;
    cin >> n;
    char c[10];
    
    for (int i = 0; i < n; i++) {
        cin >> c;
        //每次开始前先将队列清空
        while (!num.empty())num.pop_back();
        while (!sign.empty())sign.pop_back();
        //遍历输入的数据
        for (int j = 0; j < 7; j++) {
            //数字压入数据队列
            if (c[j] >= '0'&&c[j] <= '9') num.push_back(c[j] - '0');
            else {
                //对符号进行处理
                //如果是+,先压入符号队列
                if (c[j] == '+' || c[j]=='-') sign.push_back(c[j]);else if (c[j] == 'x') {
                    //运算后将运算结果压入队列中
                    int temp = num.back();
                    num.pop_back();
                    num.push_back(temp * (c[j + 1] - '0'));
                    j++;
                }
                else if (c[j] == '/') {
                    int temp = num.back();
                    num.pop_back();
                    num.push_back(temp / (c[j + 1] - '0'));
                    j++;
                }
            }
        }
        //处理队列中剩余元素(进行加法运算)
        while (!sign.empty()) {
            int temp1 = num.front();
            num.pop_front();
            int temp2 = num.front();
            num.pop_front();
            if (sign.front() == '+')num.push_front(temp1 + temp2);
            else num.push_front(temp1 - temp2);
            sign.pop_front();
        }
        //判断数据队列中剩余的最后一个元素
        if (num.front() == 24) printf("%s
", "Yes");
        else printf("%s
", "No");
    }

    system("pause");
    return 0;
}
唯有热爱方能抵御岁月漫长。
原文地址:https://www.cnblogs.com/syq816/p/12333555.html