欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[CCF] 201903-2 二十四点 Apaer_xzc

程序员文章站 2024-03-17 18:19:10
...

[CCF] 201903-2 二十四点


题面

[CCF] 201903-2	二十四点 Apaer_xzc
[CCF] 201903-2	二十四点 Apaer_xzc

思路:计算中缀表达式,然后判断24即可


我的代码

//CCF 201903-2 二十四点  
#include <bits/stdc++.h>
using namespace std;
char str[10],in[20];
int a[10]; 
int super(char ch)
{
	if(ch=='+'||ch=='-') return 2;
	if(ch=='x'||ch=='/'||ch=='*') return 3;
	if(ch=='#') return 0;
	return -1; 
}
int cal(int x,int y,char op)
{
	if(op=='+') return x+y;
	else if(op=='-') return x-y;
	else if(op=='/') return x/y;
	else return x*y;	
} 
void solve()
{	
	stack<int> num;
	stack<char> alp;
	alp.push('#');
	for(int i=0;i<7;++i)
	{
		if(isdigit(in[i]))	
		{
			num.push(in[i]-'0');
		}
		else
		{
			char now = in[i];
			while(super(now)<=super(alp.top()))
			{
				char tp = alp.top();   alp.pop();
				int right = num.top(); num.pop();
				int left  = num.top(); num.pop();
				num.push(cal(left,right,tp));
			}
			alp.push(now);
		} 
	} 
	while(!alp.empty()&&alp.top()!='#')
	{
		char tp = alp.top();
		alp.pop();
		int right = num.top();num.pop();
		int left  = num.top();num.pop();
		num.push(cal(left,right,tp));
	}
	if(num.top()==24) puts("Yes");
	else puts("No");
}
int main()
{
	int T;cin>>T;
	while(T--)
	{
		scanf("%s",in); 
		solve();
	}
	
	return 0;	
}