第一次
不知道错哪里了,怎么改都不对
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class csp3 {
// 3Ba(OH)2+2H3PO4=6H2O+Ba3(PO4)2
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int number = Integer.parseInt(input.nextLine());
String[] str= new String[number];
for(int k = 0;k<number;k++){
str[k] = input.nextLine();
}
for(int k = 0;k<number;k++) {
System.out.println(str[k]);
}
for(int p =0;p<str.length;p++) {
// String S = "3Ba(OH)2+2H3PO4=6H2O+Ba3(PO4)2";
String S = str[p];
String[] temp = S.split("=");
String[] left = temp[0].split("\\+");
String[] right = temp[1].split("\\+");
int l_length = left.length;
int r_length = right.length;
int result = 0;
Map<Character, Integer> left_map = new HashMap<>();
Map<Character, Integer> right_map = new HashMap<>();
//分离完成 计算左右两边元素个数
//left中放入等号左侧全部的元素
//left_map
for (int i = 0; i < l_length; i++) {
Map<Character, Integer> left_temp = new HashMap<>();
count(left[i], left_temp);
for (Map.Entry<Character, Integer> t : left_temp.entrySet()) {
char c = t.getKey();
if (left_map.containsKey(c)) {
left_map.put(c, left_map.get(c) + (left_temp.get(c)));//相乘 相加
} else {
left_map.put(c, (left_temp.get(c)));
}
}
}
//right_map
for (int i = 0; i < r_length; i++) {
Map<Character, Integer> right_temp = new HashMap<>();
count(left[i], right_temp);
for (Map.Entry<Character, Integer> t : right_temp.entrySet()) {
char c = t.getKey();
if (right_map.containsKey(c)) {
right_map.put(c, right_temp.get(c) + (right_temp.get(c)));//相乘 相加
} else {
right_map.put(c, (right_temp.get(c)));
}
}
}
//比较
// for (Map.Entry<Character, Integer> t : right_map.entrySet()) {
// char c = t.getKey();
// System.out.println(right_map);
// System.out.println(left_map.containsKey(c));
// if ((!left_map.containsKey(c)) || (right_map.get(c) != left_map.get(c))) {
// result = 1;
// break;
// }
// }
//输出结果
//比较两个map是否相等
if(left_map.equals(right_map)){
// if (result == 1) {
System.out.println("Y");
} else {
System.out.println("N");
}
}//退出循环
}
// s = 3Ba(OH)2 || s = 2H3PO4
public static void count( String s,Map<Character,Integer> Map ){
int length = s.length();
char[] ch = s.toCharArray();
int start = 1;
String start_s ="";
int flag =1;
//开始遍历 3Ba(OH)2 2H3PO4 H2O
for(int j =0;j<length;j++){
int end = 1;
int number = 1;
String end_s="";
String number_s="";
//分离系数
if(flag == 1) {
//系数
while ((ch[j] + 0) >= 47 && (ch[j] + 0) <= 58) {
//String 和 char 相加转化为 String
start_s += String.valueOf(ch[j]);
j++;
}
if (start_s.length() > 0)
start = Integer.parseInt(start_s);
flag = 0;
}
//放入数据
//Map.put(ch[j],(Map.getOrDefault(ch,0)+1));
if(ch[j] != '(' &&(((ch[j] + 0) >= 97 && (ch[j] + 0) <= 122)||((ch[j] + 0) >= 65 && (ch[j] + 0) <= 90))){
Map.put(ch[j], start);
}
//进入括号
if(ch[j] == '(' ){
j++;
Map<Character,Integer> temp_map = new HashMap<>();
while (ch[j] != ')') {
temp_map.put(ch[j],1);
j++;
}
//退出括号
//统计括号后的系数
j++;//跳过后括号
while (j<length && (ch[j] + 0) >= 47 && (ch[j] + 0) <= 58) {
//String 和 char 相加转化为 String
end_s += String.valueOf(ch[j]);
j++;
}
if (end_s.length() > 0)
end = Integer.parseInt(end_s);
//合并两个map
for(Map.Entry<Character,Integer> temp: temp_map.entrySet()){
char c = temp.getKey();
if(Map.containsKey(c)){
// System.out.print(Map.get(c)+(temp_map.get(c)*end)*start);
Map.put(c,Map.get(c)+(temp_map.get(c)*end)*start);//相乘 相加
temp_map.remove(c);
}else{
temp_map.put(c,(temp_map.get(c)*end)*start);//相乘 相加
}
}
// System.out.println(Map);
// System.out.println(temp_map);
Map.putAll(temp_map);//与括号中的合并
} //退出括号
//遇到数字
//这个的while变为了if
if (j<length && (ch[j] + 0) >= 48 && (ch[j] + 0) <= 57 ) {
number_s += String.valueOf(ch[j]);
j++;
}
if (number_s.length() > 0) {
number = Integer.parseInt(number_s);
Map.put(ch[j-2],number*start);
j--;
}
}
//退出函数
}
}