201903-2二十四点

转载链接
https://blog.csdn.net/richenyunqi/article/details/89188626
主要是计算四则运算时优先级的问题

#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;

int n;
char str[10];

stack<int> num;
stack<char> sign; 

int main(){
	scanf("%d",&n);
	getchar(); //读取留在缓冲区的换行符
	for(int i=0;i<n;i++){
		gets(str);
	
		while(!num.empty()) num.pop();	//清空栈
		while(!sign.empty()) sign.pop();
		
		int j=0;
		while(j<strlen(str)){
			if(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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值