【CCF】201903-2-二十四点

【CCF】201903-2-二十四点_第1张图片

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

最后 提交【CCF】201903-2-二十四点_第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
*/

你可能感兴趣的:(练习题)