【CCF】201903-2-二十四点

【【CCF】201903-2-二十四点】【CCF】201903-2-二十四点
文章图片

注 这里有几个注意得点(1)关于输入得称号一定是x,而不是*号。有个20分得点。
(2)关于存储数字要定义成int类型,因为6x4+4/5=24; 这个我之前定义成double所以结果造成除法出错。
(3)运算符得优先级我这里用map存储,在进入栈得时候分运算符栈和数字栈。
最后 提交【CCF】201903-2-二十四点
文章图片

#include #include #include #include #include #include #include #include using namespace std; /* 二十四点问题: 中缀表达式计算问题 */ const int maxN = 10; map p; bool compareOp(char a, char b){ return p[a] <= p[b]; } double cal(int a, int b, char op){ int num; switch(op){ case '+': num = a + b; break; case '-': num = a-b; break; case 'x': num = a*b; break; case '/': num = a / b; break; } return num; } void solve(int* number,char* op,int &topN, int &top){ int num1 = number[topN]; topN--; int num2 = number[topN]; topN--; int num = cal(num2,num1, op[top]); topN++; *(number+topN) = num; // *(number+topN) = num; top--; } int main(){ int n; scanf("%d",&n); string s; //定义优先级 p['+'] = p['-'] = 1; p['x'] = p['/'] = 2; while(n--){ cin>>s; int number[maxN]; char op[maxN]; int topN = -1,top=-1; for(int i = 0; i < s.size(); i++){ if(isdigit(s[i])){ number[++topN] = s[i]-'0'; //因为输入都是单个数字 }else{ //如果是操作符 while(top != -1 && compareOp(s[i],op[top])) { //运算符栈不为空,并且栈顶运算符的优先级>= s[i] solve(number,op,topN,top); } op[++top] = s[i]; //当前运算符进栈 } } //符号栈不为空得情况 while(top != -1){ solve(number,op,topN,top); }//推出时符号栈已经为空 if(number[0] == 24){ cout<<"Yes\n"; }else{ cout<<"No\n"; } } return 0; } /* 5 9+3+4x3 5+4x5x5 7-9-9+8 5x6/5x4 3+5+7+9 */ /* 2 6x7-3x6 6x4+4/5 */

    推荐阅读