ccf 20190302

ccf 20190302_第1张图片

 

 

题解:重点是考虑运算符号的优先级,乘除优于加减。

用栈来维护,最后在把栈里的元素相加

①遇到数字直接进栈

②遇到负号,取下一个数的相反数进栈,然后跳过下一个数

③遇到乘号,取弹出栈顶元素p,取下一个元素q,计算p*q进栈,跳过下一个数

④遇到除号,取弹出栈顶元素p,取下一个元素q,计算p/q进栈,跳过下一个数

⑤最后,栈非空时,累加,得到的结果和24对比即可

注意:字符串的字符-'0'即可得到相应的整数;还有栈没有clear()

 

#include 

using namespace std;

int main(){
    string s;
    stack<int> num;
    int r;
    int n;
    while(scanf("%d",&n)!=EOF){
        for(int i=1;i<=n;i++){
            cin >> s;
            r=0;
            for(int j=0;j<7;j++){
                if(s[j]-'0' >=0 && s[j]-'0'<=9)    num.push(s[j]-'0');
                if(s[j]=='-'){
                    int k = s[j+1]-'0';    
                    k=-k;            //取下一个数的相反数放入栈中,当成负数 
                    num.push(k);
                    j++;        //直接跳过下一个数 
                }
                if(s[j]=='x'){        //乘除直接计算,压到栈里 
                    int p=num.top();
                    num.pop();
                    int q=s[j+1] -'0';
                    int t=p*q;
                    num.push(t);
                    j++;
                }
                if(s[j]=='/'){
                    int p=num.top();
                    num.pop();
                    int q=s[j+1] -'0';
                    int t=p/q;
                    num.push(t);
                    j++;
                }                
            }
            while(!num.empty()){
                int t=num.top();
                num.pop(); 
                r+=t;
            }
            if(r==24)    printf("Yes\n");
            else    printf("No\n");
        }
    }
    return 0;
}

你可能感兴趣的:(ccf 20190302)