题目:
题目分析:
看到这个题是不是很熟悉,没错表达式求值,但是和之前的表达式求值不一样,这个表达式求值没有括号,且表达式长度固定
所以我们也可以用简化的思想来做这个题,普通的表达式求值可以分为两部分来做:
1.中缀表达式转后缀表达式
2.对后缀表达式进行运算
对于这个题,我们可以简化1,具体算法如下:
1.用两个栈遍历表达式,一个数字栈,一个符号栈
2.对于数字栈,可以直接入栈
3.对于符号栈,如果栈为空直接入栈,否则进行符号优先级比较,.当符号栈顶元素比当前符号优先级低时直接入栈
4.当符号栈顶元素比当前符号优先级高时,将栈顶元素弹出,并且弹出数字栈顶两个元素进行运算,在将运算结果压入数字栈,最后将当前元素入栈
5.当遍历过以后,看符号栈是否为空,如果不为空则将符号栈栈顶元素弹出,并且弹出数字栈顶两个元素进行运算,在将运算结果压入数字栈
6.最后将数字栈顶和24进行比较
PS:别忘了每组输入结束后清空栈哦
代码:
#include <bits/stdc++.h>
using namespace std;
string str;
stack<int>num;
stack<char>op;
int n;
void popp()
{
int a,b,c;
b=num.top();
num.pop();
a=num.top();
num.pop();
char x=op.top();
op.pop();
if(x=='+')
{
c=a+b;
}
if(x=='-')
{
c=a-b;
}
if(x=='x')
{
c=a*b;
}
if(x=='/')
{
c=a/b;
}
num.push(c);
}
int main()
{
ios::sync_with_stdio(0);
cin>>n;
while(n--)
{
cin>>str;
for(int i=0; i<7; i++)
{
if(i%2==0)
{
num.push(str[i]-'0');
}
else
{
if(op.empty())
{
op.push(str[i]);
}
else
{
if((str[i]=='x'||str[i]=='/')&&(op.top()=='+'||op.top()=='-'))
{
op.push(str[i]);
continue;
}
if((str[i]=='x'||str[i]=='/')&&(op.top()=='x'||op.top()=='/'))
{
popp();
op.push(str[i]);
continue;
}
if(str[i]=='+'||str[i]=='-')
{
popp();
op.push(str[i]);
continue;
}
}
}
}
while(!op.empty())
{
popp();
}
if(num.top()==24)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
while(!op.empty())
{
op.pop();
}
while(!num.empty())
{
num.pop();
}
}
return 0;
}
/*
1
9+3+4x3
10
9+3+4x3
5+4x5x5
7-9-9+8
5x6/5x4
3+5+7+9
1x1+9-9
1x9-5/9
8/5+6x9
6x7-3x6
6x4+4/5
*/