ccf-二十四点

思路:我采用堆栈的处理方式进行。定义一个符号栈,一个数字栈。遇到乘法和除法则取出栈顶元素和下一个元素进行运算,如果是加法压入将加符号压入符号栈。如果是减法,则将后面要接的数变成负数压入栈中,然后压入一个'+'压入符号栈。具体看代码。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<stack>
using namespace std;
int main(){
	int n;
	int i,j;
	int a,b;
	char s[100][30];
	scanf("%d",&n); 
	getchar();
	for(i=0;i<n;i++){
	 scanf("%s",s[i]);
}
   stack<char>ch;
   stack<int>num;
    for(i=0;i<n;i++){
    //	printf("%s ",s[i]);
    	while(!num.empty()) num.pop();//清空前一次的 
    	while(!num.empty()) ch.pop();
    	for(j=0;j<7;j++){
    		if(s[i][j]-'0'>0&&s[i][j]-'0'<=9){//题目说了1-9 
    			num.push(s[i][j]-'0');
			}
	 if(s[i][j]=='+'){
    		ch.push(s[i][j]);
    		
		}
		if(s[i][j]=='-') {//由于堆栈先进后厨,然后处于加减法运算,是从左向右的,因此全部变成加法运算,这样从左向右和从右向左都一样了。 
			ch.push('+');
			num.push((s[i][++j]-'0')*(-1));
		}
			if(s[i][j]=='x'){
				a=num.top();
                 num.pop();
				b=s[i][++j]-'0';//这里一定要变成数字型啊 
				num.push(a*b);
			//	printf("%d b ",b);
			}
			if(s[i][j]=='/'){
				a=num.top();
				num.pop();
				b=s[i][++j]-'0';
				num.push(a/b);
			}
		
		}

	int re=num.top();
	num.pop();
	char c;
//	printf("%d %d\n",ch.size(),num.size());
	while(!ch.empty()){
		c=ch.top();
		ch.pop();
		if(c=='+'){
	//			printf("%d re",re);
			re=re+num.top();
		
			num.pop();
		}else{
//				printf("%d re",re);
			re=re-num.top();//由于栈是从后往前面算的,对于符号要注意一下,顺序。前面减后面 
			
			num.pop();
		}
	}
	if(re==24)
	printf("Yes\n");
	else{
		printf("No\n");
	}
		}
	return 0;
} 

推荐一个大佬的做题方法,没有用堆栈,用C语言函数调用,成功解决了优先级问题。https://blog.csdn.net/yuanfangyoushan/article/details/100568475

发布了84 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sunandstarws/article/details/100813619