参考
https://blog.csdn.net/wingrez/article/details/85111975
https://blog.csdn.net/richenyunqi/article/details/104147851
题解一:
化学方程式,也称为化学反应方程式,是用化学式表示化学反应的式子。给出一组化学方程式,请你编写程序判断每个方程式是否配平(也就是方程式中等号左右两边的元素种类和对应的原子个数是否相同)。
本题给出的化学方程式由大小写字母、数字和符号(包括等号=、加号+、左圆括号和右圆括号)组成,不会出现其他字符(包括空白字符,如空格、制表符等),化学方程式的格式与化学课本中的形式基本相同(化学式中表示元素原子个数的下标用正常文本,如H2O写成H2O),用自然语言描述如下:
化学方程式由左右两个表达式组成,中间用一个等号三连接,如2H2+O2=2H2O;
表达式由若干部分组成,每部分由系数和化学式构成,部分之间用加号+连接,如2H2+O2、2H2O;
系数是整数或空串,如为空串表示系数为1;
整数由一个或多个数字构成;
化学式由若干部分组成,每部分由项和系数构成,部分之间直接连接,如H2O、CO2、Ca(OH)2、Ba3(PO4)2;
项是元素或用左右圆括号括起来的化学式,如H、Ca、(OH)、(P04);
元素可以是一个大写字母,也可以是一个大写字母跟着一个小写字母,如H、O、Ca。
1、总体上判断是否配平,也就是方程式中等号左右两边的元素种类和对应的原子个数是否相同
用到map<string,int> mp1,mp2 存储
要求mp1.size()==mp2.size()且要遍历mp1,mp2
bool judge(map<string,int> &left,map<string,int> &right){
if(left.size()!=right.size()) return false;
for(auto it=left.begin();it!=left.end();it++){
if(right[it->first]!=it->second) return false;
}
return true;
}
2、化学方程式由左右两个表达式组成,中间用一个等号三连接,如2H2+O2=2H2O;
表达式由若干部分组成,每部分由系数和化学式构成,部分之间用加号+连接,如2H2+O2、2H2O;
“=”“+”需要拆分string
stringstream ss(str);
getline(ss,lstr,'=');getline(ss,rstr);
加号的拆分要做循环,每次拆分得到一个化学式。
stringstream ss(str);
string item;
while(getline(ss,item,'+')){...}
3、整数由一个或多个数字构成;
写个函数把整数读取的过程分离出来,这里位置pos要&
int toNumber(string str,int &pos){
int num=0;
while(isdigit(str[pos])){
num=num*10+str[pos]-'0';
pos++;
}
return num;
}
4、接下来对化学式进行处理,分解成(元素,个数)的vector
struct Elem{ //元素
string name; //名称
int num; //个数
Elem(string _name, int _num): name(_name), num(_num){}
};
vector<Elem> arr; //存储化学式的分解序列, 如 Ba、(、(、O、H、)、(、C、O、)、)
化学式由若干部分组成,每部分由项和系数构成,部分之间直接连接,如H2O、CO2、Ca(OH)2、Ba3(PO4)2;
系数是整数或空串,如为空串表示系数为1;
整数由一个或多个数字构成;
项是元素或用左右圆括号括起来的化学式,如H、Ca、(OH)、(P04);
元素可以是一个大写字母,也可以是一个大写字母跟着一个小写字母&