题解:重点是考虑运算符号的优先级,乘除优于加减。
用栈来维护,最后在把栈里的元素相加
①遇到数字直接进栈
②遇到负号,取下一个数的相反数进栈,然后跳过下一个数
③遇到乘号,取弹出栈顶元素p,取下一个元素q,计算p*q进栈,跳过下一个数
④遇到除号,取弹出栈顶元素p,取下一个元素q,计算p/q进栈,跳过下一个数
⑤最后,栈非空时,累加,得到的结果和24对比即可
注意:字符串的字符-'0'即可得到相应的整数;还有栈没有clear()
#include <bits/stdc++.h> 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 "); else printf("No "); } } return 0; }