样例输入:
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

样例输出:
N
Y
N
Y
Y
Y
Y
Y
Y
Y
N

代码:

#include <iostream>
#include <string>
#include <sstream>
#include <map>
#include <stack>
#include <ctype.h>
using namespace std;int Get_Factor(string& s)
{int i = 0;int result = 0;if (!isdigit(s[i])){return 1;}while (isdigit(s[i])){int x = s[i] - '0';result = result * 10 + x;i++;}s = s.substr(i, s.size() - i);return result;
}//处理的思路是从后往前处理
//最后一个字符有四种情况
//反括号,数字,大写字母,小写字母
//Na(Au(CN)2),Ba(OH)2, NaOH, NaCl
map<string, int> Cal(string s)
{stringstream str(s);string temp;stack<int> num;int count;map<string, int> result;while (getline(str, temp, '+'))//得到一个化学式储存在temp当中,根据加号分隔开 {int factor = Get_Factor(temp);//得到首系数,并且可以做到把系数从字符串中剥离//接下来可以开始从最后一个字符分五种情况讨论count = 1;int i = temp.size() - 1;for (; i >= 0; i--){if (temp[i] == ')') continue;//右括号 else if (temp[i] == '(')//左括号 {if (!num.empty()){int x = num.top();count /= x;num.pop();}else{continue;}}else if (islower(temp[i]))//小写字母 {string str = temp.substr(i - 1, 2);result[str] += count*factor;i--;//把计算过后的大写字母跳过去 }else if (isupper(temp[i])){string str1 = temp.substr(i, 1);result[str1] += count*factor;}else if (isdigit(temp[i]) && temp[i - 1] == ')'){num.push(temp[i] - '0');count *= temp[i] - '0';}else if (isdigit(temp[i]) && isupper(temp[i - 1])){string str2 = temp.substr(i - 1, 1);result[str2] += factor*count * (temp[i] - '0');i--;}else if (isdigit(temp[i]) && islower(temp[i - 1])){string str3 = temp.substr(i - 2, 2);result[str3] += factor*count * (temp[i] - '0');i -= 2;}else{cout << "存在情况没有考虑" << endl;}}}return result;
}int Check(string s)//利用stringstream将字符串根据“= ”分为两部分,分别利用底层函数得到各个元素的对应个数
{stringstream str(s);string left,right;getline(str,left,'=');getline(str,right);map<string,int> left_part=Cal(left);map<string,int> right_part=Cal(right);if(left_part.size()!=right_part.size()){return 0;}else{for(map<string,int>::iterator it=left_part.begin();it!=left_part.end();it++){if(right_part[it->first]!=it->second) return 0;}return 1;}
} int main()
{int n;cin>>n;for(int i=0;i<n;i++){string temp;cin>>temp;int x=Check(temp);//配平返回1,没有配平返回0 if(x){cout<<"Y";}else{cout<<"N";}}
}

用到的少许技巧:
1.利用stringstream和getline来对字符串进行分割
2.利用栈来储存相乘的系数(不包括首系数)
3.利用map来给出元素以及个数的二维表格对应关系

需要注意的:
1.栈可能为空,需要判断,否则有的化学式会出问题
2.首系数不能最后乘(容易错),跟普通系数一起乘就行

ccf化学方程式配平检验相关推荐

  1. 用python实现化学方程式配平

    化学方程式配平是指调整化学反应的化学方程式,使得反应中所有的化学元素的原子数目在反应开始和反应结束时相等. 下面是一个简单的 Python 代码,用于配并化学方程式: ``` python 输入化学方 ...

  2. 【自己的小玩具程序】化学方程式配平【测试中】【未完成】

    化学元素周期表(Element.txt): 1    H    氢    1 2    He    氦    4 3    Li    锂    7 4    Be    铍    9 5    B  ...

  3. CCF 2019-12 第三题 化学方程式配平(100分)

    题解: 字符串模拟   题目意思很明确就是判断化学方程式是否配平. 基本思路:就是对化学方程式左边和右边的元素进行计数,然后判断所有的元素的数量是否相等即可.   第一步:对字符串进行拆分       ...

  4. 有机物燃烧的化学方程式配平(洛谷P1994题题解,Java语言描述)

    题目要求 P1994题目链接 分析 我太菜了,亏得我高中时期还虐(or被虐)生化,如今多年过去竟然没分析出来坑点,我太菜了. 我开始盲目认为"元素守恒",所以对HHH原子数求和, ...

  5. Day9 化学方程式配平

    该题的难点在于括号的嵌套,如Na6((OH)(OH)2)3,比如OH在跳出嵌套之后需乘以紧接着其外的嵌套下标,我的解法是先一遍处理以下找到每个左括号和与之配置的右括号的位置,然后使用递归,每遇到左括号 ...

  6. Python趣用—配平化学方程式

    不知不觉已经毕业多年了,不知道大家是否还记得怎么配平化学方程式呢?反正小编我是已经记不太清了,所以今天的文章除了分享如何用python配平化学方程式,顺带着还会复习一些化学方程式的知识,希望广大化学爱 ...

  7. 配平化学方程式的C++代码实现

    配平化学方程式的C++代码实现 纪念一下我今天写过了 20171006. (去年的这个时候我就有了这个大胆的想法, 当时的思路是:字符串处理->暴力搜系数,可是太年轻写不对,我那会还是个只会模拟 ...

  8. 用Python配平化学方程式

    可以使用 Python 的第三方库 Pybel 来配平化学方程式. 首先,需要安装 Pybel,可以使用以下命令进行安装: pipinstall pybel

  9. 不使用第三方库,用Python配平化学方程式

    非常好!我们可以使用 Python 内置的正则表达式库来帮助我们匹配化学方程式. 首先,我们可以使用正则表达式来匹配化学方程式的左右两边. 在这里,我们假设化学方程式的左边是一个或多个化学物质的名称, ...

最新文章

  1. php unicode转义字符串,PHP字符串中的Unicode字符
  2. 【TensorFlow】tf.nn.conv2d是怎样实现卷积的?
  3. python time datetime string 相互转换
  4. WebClient UI framework - how tree proxy structure node is rendered
  5. html app从上向下弹框,移动端从底部向上过渡弹出弹框
  6. dynamic和匿名对象
  7. zoom 用户被锁定_重新考虑Zoom的用户体验
  8. 记录一次可能的order by注入
  9. win10收集错误信息重启蓝屏解决
  10. zabbix自定义监控nginx
  11. TensorFlow :HelloWorld
  12. C51单片机,点亮小灯的入门级教程
  13. 小米路由器mini刷Breed,安装固件教程
  14. 高效能管理之要事第一 时间管理表格2
  15. C++智能指针入门之unique_ptr
  16. AR、MA、ARMA和ARIMA模型------时间序列预测
  17. 2020支付行业七大预测:聚合支付牌照有望正式落地
  18. 5个开发必备的 Python 工具,你用过几个?
  19. 关于Python的一些要点
  20. 超能陆战队之大白制作过程

热门文章

  1. python安装完了还要安装什么-主角在异界开店的小说
  2. MySQL数据库的基本管理操作
  3. 微信会员php源码,基于ThinkPHP框架开发的在线微信拼车系统完整PHP源码-深蓝源码会员专享...
  4. mindmanager2021思维导图利器有效序列号秘钥
  5. 微软Hyper-V虚拟机复制实现双机备份过程
  6. 计算机视频的压缩方式,如何在电脑上对视频进行压缩?一分钟教你学会视频压缩方法...
  7. android基本布局-TableLayout_表格布局
  8. Flutter 移动光标 关闭弹出的键盘
  9. 393高校毕业设计选题
  10. 概率论:古典概型与伯努利概型