CCF计算机软件能力认证试题练习:201903-2 二十四点
解题思路
表达式中只含有+、-、x、/四种运算,我们可以简单地用栈来计算它的值。过程是这样的,顺序遍历表达式,如果遇到的是数字,压入数字栈,如果遇到的是符号,压入符号栈。注意,由于x、/的优先级较高,所以当遇到乘法和除法时,直接计算结果,并把结果压入数字栈。还由于,减法的结合性是从左向右的,所以我们做一个简单地转换,将所有的减法变为加法。最后数字栈中的数就是结果了。
此外,本道题还可以构造表达式树。
原文:https://blog.csdn.net/wingrez/article/details/88676235
参考代码:
#include#include#includeusing namespace std;
int main(){
int n;
cin >> n;
while(n--){
string exp;
cin >> exp;
stacks1;
stacks2;
for(int i = 0 ; i < exp.length(); i++){
if(exp[i] >= '1' && exp[i] <= '9'){
s1.push(exp[i] - '0');
}else if(exp[i] == '+' || exp[i] == '-'){
s2.push(exp[i]);
}else{
int n1,n2;
switch(exp[i]){
case 'x':
n1 = s1.top();
s1.pop();
n2 = n1 * (exp[++i] - '0');
s1.push(n2);
break;
case '/':
n1 = s1.top();
s1.pop();
n2 = n1 / (exp[++i] - '0');
s1.push(n2);
break;
}
}
}
stacks3;
stacks4;
while(!s1.empty()){
s3.push(s1.top());
s1.pop();
}
while(!s2.empty()){
s4.push(s2.top());
s2.pop();
}
while(!s4.empty()){
char c = s4.top();
//cout << "c:=" << c << " ";
s4.pop();
int temp1 = s3.top();
s3.pop();
int temp2 = s3.top();
//cout << "temp1=" << temp1 << " temp2=" << temp2 << endl;
s3.pop();
switch(c){
case '+':
//cout << "temp1 + temp2 = " << temp1 + temp2 << " " << endl;
s3.push(temp1 + temp2);
break;
case '-':
//cout << "temp1 - temp2 = " << temp1 - temp2 << " " << endl;;
s3.push(temp1 - temp2);
break;
}
//cout << "s1.size = " << s1.size() << endl;
}
int res = s3.top();
//cout< if( res == 24) cout << "Yes" << endl;
else cout << "No" << endl;
}
//system("pause");
return 0;
}
来源:https://bbs.csdn.net/topics/392583232
上面这种方法提交100分。
下面这种方法我也觉得可以。
#include#include#includeusing namespace std;
int n;
char str[10];
stacknum;
stacksign;
int main(){
scanf("%d",&n);
getchar();
for(int i=0;igets(str);
while(!num.empty()) num.pop();
while(!sign.empty()) sign.pop();
int j=0;
while(jif(str[j]>'0' && str[j]<='9'){
num.push(str[j]-'0');
}
else{
if(str[j]=='+'){
sign.push('+');
}
else if(str[j]=='-'){ //将减法转换成加法
num.push((str[j+1]-'0')*(-1));
sign.push('+');
j++;
}
else if(str[j]=='x'){ //直接计算乘法
int lhs=num.top();
num.pop();
num.push(lhs*(str[j+1]-'0'));
j++;
}
else if(str[j]=='/'){ //直接计算除法
int lhs=num.top();
num.pop();
num.push(lhs/(str[j+1]-'0'));
j++;
}
}
j++;
}
while(!sign.empty()){ //计算剩余的加法
int rhs=num.top();
num.pop();
int lhs=num.top();
num.pop();
sign.pop();
num.push(lhs+rhs);
}
int ans=num.top();
if(ans==24) printf("Yes\n");
else printf("No\n");
}
return 0;
}
但提交的时候说超时了,而且超出空间限制了。