import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main{
private static boolean judge(String s) {
Stack<Integer> nums=new Stack<Integer>();
Stack<Character> sign=new Stack<Character>();
int sum=0;
for(int i=0;i<s.length();i++) {
char c=s.charAt(i);
if(c>'0' && c<='9')
nums.add(c-'0');
else {
if(c=='+' ) sign.add(c);
else if(c=='-') {
int R=s.charAt(i+1)-'0';
R=(-1)*R;
sign.add('+');
nums.add(R);
i++;
}
else if(c=='x') {
int L=nums.pop();
int R=s.charAt(i+1)-'0';
int res=L*R;
nums.add(res);
i++;
}
else if(c=='/') {
int L=nums.pop();
int R=s.charAt(i+1)-'0';
int res=L/R;
nums.add(res);
i++;
}
}
}
while(!sign.isEmpty()) {
sign.pop();
int L=nums.pop();
int R=nums.pop();
int res=L+R;
nums.add(res);
}
sum=nums.pop();
System.out.print("="+sum);
return sum==24;
}
public static void main(String[] args) {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
try {
int n=Integer.parseInt(br.readLine());
String[] strs= new String[n];
for(int i=0;i<n;i++) {
String s=br.readLine();
strs[i]=s;
}
for(String s:strs) {
if(judge(s)) System.out.println("Yes");
else System.out.println("No");
}
} catch (NumberFormatException | IOException e) {
e.printStackTrace();
}
}
}
下面附上我自己写的100个随机解的生成器,对查找自己算法的漏洞很有帮助(为什么是100个因为子任务里说啦是n=10^2)更清楚一点可以在judge函数中添加打印sum行为,更容易看出是哪种解错了
public static void main(String[] args) {
for(int m=0;m<100;m++) {
char[] row=new char[7];
char[] signs= {'+','-','x','/'};
for(int i=0;i<3;i++){
int a=(int)(Math.random()*4);
int b=(int)(Math.random()*3);
int c=a-b;
if(c<0) c=(-1)*c;
char choosed=signs[c];
row[2*i+1]=choosed;
}
int[] nums=generateRandomArr();
for(int i=0;i<nums.length;i++) {
row[2*i]=Integer.toString(nums[i]).charAt(0);
}
String s=String.valueOf(row);
for(int i=0;i<s.length();i++) System.out.print(s.charAt(i));
if(judge(s)) System.out.println(" Yes");
else System.out.println(" No");
}
}
public static int[] generateRandomArr() {
int[] res=new int[4];
int maxValue=9;
for(int i=0;i<4;i++) {
int a=(int) (Math.random()*(maxValue+1));
int b=(int) (Math.random()*maxValue);
int c=a-b;
if(c<0) c=(-1)*c;
while(c==0) c+=(int) (Math.random()*maxValue);
res[i]=c;
}
return res;
}