思路
- 开两个栈,一个存符号,一个存数字;
- 扫描字符串,遇数存数栈,遇‘+’直接存,遇 ‘-’ 变为‘+’存,遇 ‘x’ 直接计算,并将结果压入数字栈,遇 ‘/’ 同理于 ‘x’;
- 最后字符栈里只剩 ‘+’ ,循环计算直至栈空。
代码
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
int i, j, n;
char a[8];
stack<int> num;
stack<char> sign;
int main()
{
scanf("%d", &n);
getchar();
while (n--)
{
scanf("%s", a);
while (!num.empty())
num.pop();
while (!sign.empty())
sign.pop();
i = 0;
while (i < 7)
{
if (a[i] > '0' && a[i] <= '9')
num.push(a[i]-'0');
else
{
if (a[i] == '+')
sign.push(a[i]);
else if (a[i] == '-')
{
num.push((a[i + 1] - '0') * (-1));
sign.push('+');
i++;
}
else if (a[i] == 'x')
{
int ans = num.top();
num.pop();
num.push(ans * (a[i + 1] - '0'));
i++;
}
else if (a[i] == '/')
{
int ans = num.top();
num.pop();
num.push(ans / (a[i + 1] - '0'));
i++;
}
}
i++;
}
while (!sign.empty())
{
int ans1 = num.top();
num.pop();
int ans2 = num.top();
num.pop();
sign.pop();
num.push(ans1 + ans2);
}
int ans = num.top();
if (ans == 24)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}