CCF认证 201903-2二十四点

欢迎访问我的CCF认证考试题解目录哦 https://blog.csdn.net/richenyunqi/article/details/83385502

题目描述

CCF认证 201903-2二十四点_第1张图片

算法设计

这是一道求解四则表达式结果的题目。由于只涉及到四则表达式运算符,只有两个优先级,可以进行两次遍历,第一次先求解出所有乘除法的结果,第二次遍历求解出所有加减法的结果。为此,可以定义两个队列:

  • queuenum:存储加减法的操作数和乘除法的结果
  • queueop:存储+-符号

第一次遍历整个表达式,将加减法的操作数和加减号存储起来,第二次同时遍历两个队列,求解出最终结果。为了编码方便,可以在每一个表达式的末尾添加上+0字符,最终结果不变,但是编码会方便很多。具体实现可见代码。

C++代码

#include
using namespace std;
int main(){
    int n;
    string s;
    cin>>n;
    queue<int>num;//存储加减法的操作数和乘除法的结果
    queue<char>op;//存储+、-符号
    while(n--){
        cin>>s;
        s.push_back('+');//在每个表达式末尾加上"+"字符
        for(int i=1;i<s.size();i+=2){//遍历整个字符串
            int t=s[i-1]-'0';
            for(;i<s.size()&&s[i]=='x'||s[i]=='/';i+=2){//求出连续乘除运算的结果
                t=(s[i]=='x')?t*(s[i+1]-'0'):t/(s[i+1]-'0');
            }
            num.push(t);
            op.push(s[i]);
        }
        num.push(0);//加减法操作数再放入一个0,保证在整个表达式末尾添上了+0运算
        int t=num.front();//第一个加减法操作数
        num.pop();
        while(!op.empty()){//同时遍历两个队列,求出加减运算的结果
            char c=op.front();
            op.pop();
            t=(c=='+')?t+num.front():t-num.front();
            num.pop();
        }
        puts(t==24?"Yes":"No");
    }
    return 0;
}

你可能感兴趣的:(CCF)