#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
int n;
cin>>n;
int **a=new int*[n];
for(int i=0;i<n;i++){
a[i]=new int[4];
}
char **b=new char*[n];
for(int i=0;i<n;i++){
b[i]=new char[4];
}
for(int i=0;i<n;i++){
// cin>>a[i][0];
// b[i][0]=getchar();
// cin>>a[i][1];
// b[i][1]=getchar();
// cin>>a[i][2];
// b[i][2]=getchar();
// cin>>a[i][3];
scanf("%d%c%d%c%d%c%d",&a[i][0],&b[i][0],&a[i][1],&b[i][1],&a[i][2],&b[i][2],&a[i][3]);
}
for(int i=0;i<n;i++){
int num1=4;//数字剩余的个数
int num2=3;//字符个数
while(num1!=1){
for(int j=0;j<num2;j++){
if(b[i][j]=='x')a[i][j]=a[i][j]*a[i][j+1];
else if(b[i][j]=='/')a[i][j]=a[i][j]/a[i][j+1];
else if(j==num2-1&&b[i][j]=='+')a[i][j]=a[i][j]+a[i][j+1];
else if(j==num2-1&&b[i][j]=='-')a[i][j]=a[i][j]-a[i][j+1];
else continue;
//符号和数字相对应,运算一次后,数字和符号都减少,保持靠左对齐,下面的操作是向左移位,保持紧凑
for(int k=j+1;k<num1-1;k++){
a[i][k]=a[i][k+1];
}
num1--;
for(int k=j;k<num2-1;k++){
b[i][k]=b[i][k+1];
}
num2--;
break;
}
}
if(a[i][0]==24&&i!=n-1){
cout<<"Yes"<<endl;
}
else if(a[i][0]==24&&i==n-1){
cout<<"Yes";
}
else if(a[i][0]!=24&&i!=n-1){
cout<<"No"<<endl;
}
else cout<<"No";
}
return 0;
}
我本人的思路不是网上常用的堆栈的方法,利用的是两个普通数组进行的,一个存数字,一个存符号
先把除法和乘法扫描出来运算,转化成加法减法,每一次运算后保持进行移位靠左对齐保证数字和运算符对应,
希望有能力的大佬帮忙解答一下