//201903-2二十四点
#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
stack<int> nd;//操作数栈
stack<char> op;//操作符栈
char str[7];
int main()
{
int n,a,b,i,j;
cin>>n;
getchar(); //读取换行符,易漏!!!
for(i=0;i<n;i++)
{
while(!nd.empty()) nd.pop();//清空栈
while(!op.empty()) op.pop();
gets(str);//读取字符串
for(j=0;j<strlen(str);j++)
{
if(str[j]>='0'&&str[j]<='9')//若为数字,压入nd栈中
{
nd.push(str[j]-'0');
}
else if(str[j]=='+') //若为'+',压入op栈中
{
op.push('+');
}
else if(str[j]=='-')//转化为"+"计算(即将正数存储为负数,而op栈中就可以存放'+'了)
{
nd.push((str[j+1]-'0')*(-1));
op.push('+');
j++;
}
else if(str[j]=='x')//because乘法优先级高,so弹出栈顶,与下一个未压入栈的数字计算,将计算结果压入数栈;
{
a=nd.top(); nd.pop();
b=str[j+1]-'0';
nd.push(a*b);
j++;
}
else if(str[j]=='/')//与乘法同理
{
a=nd.top(); nd.pop();
b=str[j+1]-'0';
nd.push(a/b);
j++;
}
}
while(!op.empty())//此时只剩下'+'未计算了
{
a=nd.top(); nd.pop();
b=nd.top(); nd.pop();
op.pop();
nd.push(a+b);
}
if(nd.top()==24)//取出栈中数字,看是否=24
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
CCF [201903-2] 二十四点
最新推荐文章于 2023-04-21 08:26:27 发布