CCF201912-3 化学方程式*

参考

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);
    元素可以是一个大写字母,也可以是一个大写字母跟着一个小写字母&
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值