题目:
由于时间有限, 直接截取了CCF的截图
思路:
1. 把式子输入到字符串
2.为了操作方便, 把字符串转化为集合
3.先解决乘法除法运算
步骤:判断运算符, 若为乘号, 则对乘号前后的两个数做乘法运算, 结果保存到临时变量中, 依次删除"乘号"后面的"数字"和"乘号", 把临时变量附给"乘号"前面的值. 这就完成了一次运算. 注意, 因为删除操作,使集合的下标改变了, 所以需要给迭代变量重新赋值. 继续遍历有无乘号或者除号!
相同的方法, 处理除号.
4.再用相同的方法解决加号减号
5.此时集合中只剩下一个元素了, 即为结果
6.与24比较,输出结果
代码如下:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//字符串个数
int n=sc.nextInt();
//存储最终结果"Yes""No"
String[] result=new String[n];
for(int i=0;i<n;i++){
//将输入的运算公式放在String数组里
String string = sc.next();
//由于集合删除元素后,下标会下移,操作方便 把字符串转化为集合
List<String> list=new ArrayList<String>();
for(int j=0;j<string.length();j++){
list.add(string.substring(j,j+1));
}
//把乘法和除法解决掉, 让剩下的字符串只包含加减运算
for(int j=1;j<list.size()-1;j++){
if(list.get(j).equals("*")){//如果运算符是乘号
//取出乘号两边的数
int number1=Integer.parseInt(list.get(j-1));
int number2=Integer.parseInt(list.get(j+1));
//把结果转化成字符串存放到target变量中
String target=number1*number2+"";
//注意移除顺序
list.remove(j+1);
list.remove(j);
list.set(j-1, target);
//因为以上操作改变了下标,所以应该从头开始遍历
j=0;
}else if (list.get(j).equals("/")) {//同理,对除法进行操作
int number1=Integer.parseInt(list.get(j-1));
int number2=Integer.parseInt(list.get(j+1));
String target=number1/number2+"";
list.remove(j+1);
list.remove(j);
list.set(j-1, target);
j=0;
}
}
//处理加法减法运算
for(int j=1;j<list.size()-1;j++){
if(list.get(j).equals("+")){
int number1=Integer.parseInt(list.get(j-1));
int number2=Integer.parseInt(list.get(j+1));
String target=number1+number2+"";
list.remove(j+1);
list.remove(j);
list.set(j-1, target);
j=0;
}else if (list.get(j).equals("-")) {
int number1=Integer.parseInt(list.get(j-1));
int number2=Integer.parseInt(list.get(j+1));
String target=number1-number2+"";
list.remove(j+1);
list.remove(j);
list.set(j-1, target);
j=0;
}
}
//此时,只剩下一个元素了
if(list.get(0).equals(24+"")){
result[i]="Yes";
}else {
result[i]="No";
}
}
sc.close();
for (String string : result) {
System.out.println(string);
}
}
}