思路:
将方程式分为左式和右式,统计元素分别存入两个map中,最后比较map是否完全相同即可。自己编写的有点冗长,不过是分块编写的,若不考虑括号处理,也可以很高效的拿到60分。
总体来说算比较基础的模拟题,考点就是字符串的处理和括号匹配。
#include<bits/stdc++.h>
using namespace std;
struct node{
string ele;
int n;
node(string a,int b):ele(a),n(b){} ;
};
int handle(string str,map<string,int> &temp){ //括号入栈函数
stack<node>s,st;
s.push(node(str.substr(0,1),0));
int i=1;
while(!s.empty()){
if(str[i]=='('){
s.push(node(str.substr(i,1),0));
i++;
}
else if(isalpha(str[i])){
string ele=str.substr(i,1);
i++;
if(isalpha(str[i])==2){
ele=ele+str.substr(i,1);
i++;
}
int Num1=1;
if(isdigit(str[i])){
Num1=0;
while(isdigit(str[i])){
Num1=Num1*10+str[i]-'0';
i++;
}
}
s.push(node(ele,Num1));
}
else if(str[i]==')'){
i++;
int Num2=1;
if(isdigit(str[i])){
Num2=0;
while(isdigit(str[i])){
Num2=Num2*10+str[i]-'0';
i++;
}
}
while(s.top().ele!="("){
node cur=s.top();
s.pop();
cur.n=cur.n*Num2;
st.push(cur);
}
s.pop();
if(s.empty())break;
while(!st.empty()){
s.push(st.top());
st.pop();
}
}
}
while(!st.empty()){
node now=st.top();
st.pop();
if(temp[now.ele]>0){
temp[now.ele]+=now.n;
}
else temp[now.ele]=now.n;
}
i--;
return i;
}
void elecompare(map<string,int>mpl,map<string,int>mpr){ //比较输出
int flag=1;
for(map<string,int>::iterator it=mpl.begin();it!=mpl.end();it++){
if(it->second!=mpr[it->first]){
flag=0;
break;
}
}
for(map<string,int>::iterator it=mpr.begin();it!=mpr.end();it++){
if(it->second!=mpl[it->first]){
flag=0;
break;
}
}
if(flag==1)cout<<'Y'<<endl;
else cout<<'N'<<endl;
}
void elecal(string str,map<string,int> &mp){ //元素统计
map<string,int> temp;
int mul=1;
for(int i=0;i<str.size();i++){
//首位是数字暂存
if(isdigit(str[i])&&i==0){
int num=0;
while(isdigit(str[i])){
num=num*10+str[i]-'0';
i++;
}
mul=num;
}
//字母处理
if(isalpha(str[i])){
string ele=str.substr(i,1);
i++;
if(isalpha(str[i])==2){
ele=ele+str.substr(i,1);
i++;
}
int num1=1;
if(isdigit(str[i])){
num1=0;
while(isdigit(str[i])){
num1=num1*10+str[i]-'0';
i++;
}
i--;
}
else i--;
if(temp[ele]>0){
temp[ele]+=num1;
}
else temp[ele]=num1;
}
//括号处理
if(str[i]=='('){
i=i+handle(str.substr(i),temp);
}
}
for(auto it:temp){
if(mp[it.first]>0){
mp[it.first]+=it.second*mul;
}
else mp[it.first]=it.second*mul;
}
}
void resolve(string str,vector<string> &v){ //分解为化学分子
int beg=0,s;
while(str.find('+',beg)!=-1){
s=str.find('+',beg);
v.push_back(str.substr(beg,s-beg));
beg=s+1;
}
v.push_back(str.substr(beg));
}
void deal(string str){ //处理函数
map<string,int> mpl,mpr;
vector<string> vl,vr;
string left,right;
int s=str.find('=');
left=str.substr(0,s);
resolve(left,vl);
right=str.substr(s+1);
resolve(right,vr);
for(auto it:vl){
elecal(it,mpl); //化学元素统计
}
for(auto it:vr){
elecal(it,mpr);
}
elecompare(mpl,mpr); //比较输出
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){ //输入&处理
string str;
cin>>str;
deal(str);
}
return 0;
}
样例:
/*
试题测试样例:NNNYYYYYYYY
2
(((((((((((((A)13)12)11)10)9)8)7)6)5)4)3)2)1=1(2(3(4(5(6(7(8(9(10(11(12(13(A)))))))))))))
(((((((((((((A)1)12)3)10)5)8)7)6)9)4)11)2)13=1(12(3(10(5(8(7(6(9(4(11(2(13(A)))))))))))))
6
H2+O2=H2O
2H2+O2=2H2O
H2+Cl2=2NaCl
H2+Cl2=2HCl
CH4+2O2=CO2+2H2O
Cu+As=Cs+Au
5
CaCl2+2AgNO3=Ca(NO3)2+2AgCl
3Ba(OH)2+2H3PO4=6H2O+Ba3(PO4)2
3Ba(OH)2+2H3PO4=Ba3(PO4)2+6H2O
4Zn+10HNO3=4Zn(NO3)2+NH4NO3+3H2O
4Au+8NaCN+2H2O+O2=4Na(Au(CN)2)+4NaOH
3
2H2O+O2=4NaOH
4Au+8NaCN+2H2O+O2=4Na(Au(CN)2)+4NaOH
4Au+8NaCN+2H2O+O2=4Na+4NaOH
1
(Au(CN)2)=(Au(CN)2)
11
H2+O2=H2O
2H2+O2=2H2O
H2+Cl2=2NaCl
H2+Cl2=2HCl
CH4+2O2=CO2+2H2O
CaCl2+2AgNO3=Ca(NO3)2+2AgCl
3Ba(OH)2+2H3PO4=6H2O+Ba3(PO4)2
3Ba(OH)2+2H3PO4=Ba3(PO4)2+6H2O
4Zn+10HNO3=4Zn(NO3)2+NH4NO3+3H2O
4Au+8NaCN+2H2O+O2=4Na(Au(CN)2)+4NaOH
Cu+As=Cs+Au
自测测试样例:YYYYYYYYYYYYY
13
AAAAAAA=AAAAAAA
AaAaAaAa=AaAaAaAa
ABCDEFG=GFEDCBA
AaABbBCcCDdDEeEFfFGgG=GgGFfFEeEDdDCcCBbBAaA
2AAAAAA=3AAAA
2AaAAaAAaAAaAAaAAaA=3AaAAaAAaAAaA
(((((((((((((A)))))))))))))=(((((((((((((A)))))))))))))
(((((((((((((Aa)))))))))))))=(((((((((((((Aa)))))))))))))
(((((((((((((AaA)))))))))))))=(((((((((((((AAa)))))))))))))
(((((((((((((A)13)12)11)10)9)8)7)6)5)4)3)2)1=1(2(3(4(5(6(7(8(9(10(11(12(13(A)))))))))))))
(((((((((((((A)1)12)3)10)5)8)7)6)9)4)11)2)13=1(12(3(10(5(8(7(6(9(4(11(2(13(A)))))))))))))
(A)(A)(A)(A)(A)(A)(A)=(A)(A)(A)(A)(A)(A)(A)
3A(A(A(A(A(((A))B2)2AB)2A)2A)2A)2A=3AA+6AA+12AA+24AA+48AAB+96ABB
*/