CCF-CSP备考记录:201903-2 二十四点
题目
题目分析
本题目是对算术表达式的处理。
首先,把读取的中缀表达式转化为后缀表达式(方便后期计算处理):
- 如果是数字,直接加入后缀表达式末尾;
- 如果是操作符:若符号栈空,直接压入栈中;若栈不空,比较栈顶元素和此操作符的优先级, 若栈顶元素优先级高,则弹出栈顶,加入后缀表达式末尾,重复操作,直到不满足栈顶元素优先级高或栈空。把栈外操作符压入栈中。
- 表达式读取完后,若符号栈非空,依次弹出栈内元素,加入后缀表达式末尾。
然后,读取后缀表达式计算:
- 若是数字,压入数字栈中;
- 若是操作符,从数字栈中弹出两个数字(第一个为右操作数,第二个左操作数),计算,把结果压入数字栈。
最后数字栈底的数字即为最终结果。
比较结果是否为24,在标志数组中记录。
100分c++代码:
#include <iostream>
#include<string>
#include<stack>
using namespace std;
#define N 101
bool judge_op(char ch){//判断是否为运算符
if((ch=='+')||(ch=='-')||(ch=='x')||(ch=='/'))return true;
return false;
}
int priority(char ch){//返回优先级
if((ch=='+')||(ch=='-'))return 1;
if((ch=='x')||(ch=='/'))return 5;
return 0;
}
int calc(int l,char ch,int r){//计算
if(ch=='+')return l+r;
if(ch=='-')return l-r;
if(ch=='x')return l*r;
if(ch=='/')return l/r;
}
int main(int argc, char** argv) {
int n,res[N]={0};
stack<int>num; //数栈
stack<char>oper; //符号栈
cin>>n;
for(int i=0;i<n;i++){
string func,back_func;//表达式,后缀表达式
cin>>func;
//变为后缀表达式
for(int j=0;j<7;j++){
char a=func[j];
if(judge_op(a)){ //是字符串
if(oper.empty())oper.push(a);
else{
char tmp=oper.top();
while(priority(tmp)>=priority(a)){
oper.pop();//获取栈顶
//back_func.push_back(tmp);
back_func+=tmp;
if(!oper.empty()) tmp=oper.top();
else break;
}
oper.push(a);//入栈
}
}
else back_func+=func[j];
}
while(!oper.empty()){
back_func+=oper.top();
oper.pop();
}
//计算后缀表达式
int l,r,re;
for(int j=0;j<7;j++){
char a=back_func[j];
if(!judge_op(a)){//是数字
num.push(a-'0');
}
else{
r=num.top();num.pop();
l=num.top();num.pop();
re=calc(l,a,r);
num.push(re);
}
}
re=num.top();num.pop();
if(re==24)res[i]=1;
}
for(int i=0;i<n;i++){
if(res[i])cout<<"Yes";
else cout<<"No";
if(i!=n-1)cout<<'\n';
}
return 0;
}
THE END!