题目
分析
由于题目中说了,不存在括号以及只有四个数字和三个符号,因此运算形式其实是比较单一的,如果不采用栈,也可以直接分类讨论运算
思路:
分类:
①只有+ -或者只有x / ,这种情况就直接按顺序运算即可;
②+ - 和 x / 混杂:
步骤:
SP1:需要先计算x /,并且把计算的值储存在另开辟的数组中,将原字符串中运算过的数字和符号修改为与储存位置相关的字符(我采用的是 下标+‘a’);
SP2:再判断+ - 符号的位置,进行+ -运算;
还有另外一种方法,就是用两个栈,一个存字符,一个存数字,暂时还未写,下次继续更新
AC代码 1
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin>>n;
while(n--) {
int sum=0;
string s;
cin>>s;
int a[3]= {0,0,0};//记录数字
int currsize=0;
int sign=3;
for(int i=1; i<6; i+=2) {//判断是否全是+- or全是x/
if(s[i]=='x'||s[i]=='/')
sign++;
sign--;
}
if(sign==3||sign==0) {//可以从左到右直接顺序运算
sum=int(s[0]-'0');
for(int i=1; i<6; i+=2) {
if(s[i]=='x')
sum*=int(s[i+1]-'0');
else if(s[i]=='/')
sum/=int(s[i+1]-'0');
else if(s[i]=='-')
sum-=int(s[i+1]-'0');
else if(s[i]=='+')
sum+=int(s[i+1]-'0');
}
} else {//
char temp;
for(int i=1; i<6; i+=2) {//先进行乘除法
temp=char(currsize+'a');//将已经运算过的符号和数字改换成temp 表示存储到a[]中
if(s[i]=='x') {//如果是乘法
if(s[i-1]<='9' and s[i-1]>='0') {//前面的数是数字
a[currsize]=int (s[i-1]-'0')*int (s[i+1]-'0');//直接相乘
s[i]=s[i-1]=s[i+1]=temp;//s记录表示这里已经运算过了,并且储存在a[]中
} else {
a[currsize]=a[int(s[i-1]-'a')]*int(s[i+1]-'0');//前面的数字已经运算过了,从a[]中提取
s[i-3]=s[i-2]=s[i]=s[i-1]=s[i+1]=temp;//标记储存在a[]的位置
}
currsize++;//a[]存储的数量++
}
if(s[i]=='/') {//同理
if(s[i-1]<='9' and s[i-1]>='0') {
a[currsize]=int (s[i-1]-'0')/int (s[i+1]-'0');
s[i]=s[i-1]=s[i+1]=temp;
} else {
a[currsize]=a[int(s[i-1]-'a')]/int (s[i+1]-'0');
s[i-3]=s[i-2]=s[i]=s[i-1]=s[i+1]=temp;
}
currsize++;
}
}
//接下来计算剩下的+和-
int y=0;
if(s[0]<='9' and s[0]>='0')//如果第一个数字还是数字 sum=第一个数
sum=int (s[0]-'0');
else
sum=a[int(s[0]-'a')];//已经运算过了,sum=运算后的
for(int i=1; i<6; i+=2) {
if(s[i]!='+' and s[i]!='-')//找需要进行+ -的符号
continue;
if(s[i+1]<='9' and s[i+1]>='0')//后一个数字
y=int(s[i+1]-'0');
else
y=a[int(s[i+1]-'a')];
if(s[i]=='+') {
sum+=y;
}
if(s[i]=='-') {
sum-=y;
}
}
}
// cout<<sum<<endl;//方便debug
if(sum==24)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}