#题目
#说明
最近学了点正则原打算用正则做,但是在括号嵌套方面正则表达式不懂处理,栈方面不熟悉就还没考虑。匹配化学元素和系数可以一个个字符处理没必要用正则,这里我是练习所以用了正则。
这道题的解题思路大多采用递归求解这里也是(如果有同学有其他思路请留言一起学习~~~),这题麻烦点的地方在于括号嵌套处理 。大体思路是 比如“CH4+2O2=CO2+2H2O”,用“=”切片分左右两部分,用”+“切片递归处理每一个化学式。
处理化学式思路是:化学式是字符串,利用索引从左到右一点一点处理直到字符串结束。遇到无括号直接是元素的就添加进记录,遇到括号就递归。
#输入样例
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
#代码
import re
pattern_ele = re.compile(r'[A-Z][a-z]?') #匹配化学元素的模式
pattern_lc = re.compile(r'^\d+') #匹配左边系数的模式
pattern_rc = re.compile(r'\d+$') #匹配右边系数的模式
pattern_term = re.compile(r'^[A-Z][a-z]?\d*') #匹配化学式中的项(元素部分)和系数
#该函数用于处理系数和化学式
'''
if:处理测试编号点1-6
elif/else:处理测试编号点7-10
'''
def deal_formula(ceof,formula,dic):
i = 0
while i < len(formula):
term = pattern_term.match(formula[i:])
if term !=