Given a string of chemical formula , count the number of atoms of each element.
For example:
Water molecule'H2O', its composition is 2 hydrogen atoms, 1 oxygen atoms, expressed as {H: 2, O: 1}.
Another example is magnesium hydroxide'Mg(OH)2', expressed as an object{Mg: 1, O: 2, H: 2}.
Let’s take another complicated one,'K4[ON(SO3)2]2', expressed as {K: 4, O: 14, N: 2, S: 4}. In these molecular formulas, there may be many pairs of brackets, including round, square, and curly. If there are numbers following the brackets, it indicates the number of atoms in the brackets. How many times to multiply. For example, 'Fe(NO3)2' is composed of one iron atom, two nitrogen atoms, and six oxygen atoms.
The difficulty of this question lies in the processing of brackets. There are three types of brackets. There are nesting between brackets, and there areN pairs of brackets. //利用进出栈括号相抵,求对应括号的位置
function findBracket(str){
var stack = ["("];
for(var i=0;i<str.length;i++){
var chr = str.charAt(i);
if(chr === "("){
stack.push(chr);
}
else if(chr === ")"){
stack.pop();
}
if(!stack.length){
return i;
}
}
}
function parseMolecule(formula) {
//存放结果的hash
var hash = {};
//先将所有的括号统一为圆括号
formula = formula.replace(/{/g ,"(")
.replace(/}/g ,")")
.replace(/\[/g ,"(")
.replace(/\]/g ,")");
//遍历方法
var traverse = function(formula){
var str = "";
//存放数字之前的字符串
var prev = "";
for(var i=0;i<formula.length;i++){
var chr = formula.charAt(i);
//如果当前字符是数字
if(!isNaN(chr)){
//如果右边的字符也是数字
//如"O12",十二个氧原子
if(!isNaN(formula.charAt(i+1))){
//"1" + "2" = "12"
chr += formula.charAt(i+1);
i++;
}
//转化为数字
//"12" => 12
chr = chr - 0;
//拼接"O"
//=> "OOOOOOOOOOOO"
while(chr--){
str += prev;
}
}
else if(chr === "("){
//剪切两个括号之间的内容,递归
//如"Mg(OH)2"
//"OH"递归
var temp = formula.slice(i+1);
var pos = findBracket(temp);
//=>"OH"
prev = traverse(temp.slice(0,pos));
//右括号位置")"
i = pos + i + 1;
//如果右括弧右边不是数字,直接拼接"OH",无须相乘
if(isNaN(formula.charAt(i+1))){
str += prev;
}
}//如果当前字符右边是数字
else if(formula.charAt(i+1) && !isNaN(formula.charAt(i+1))){
prev = chr;
}//如果当前字符右边是小写字母,再右边是数字
else if(formula.charCodeAt(i+1) >= 97 && formula.charCodeAt(i+1) <= 122 && formula.charAt(i+2) && !isNaN(formula.charAt(i+2))){
prev = chr + formula.charAt(i+1);
i++;
}
else{
str += chr;
}
}
//如"Mg(OH)2"
//=> "MgOHOH"
return str;
};
var result = traverse(formula);
//将字符串遍历,在hash中存储
for(var i=0;i<result.length;i++){
var nextCode = result.charCodeAt(i+1);
//例如"Mg","Fe","Cu"这样一个大写接一个小写的情况
if(nextCode >= 97 && nextCode <= 122){
var key = result.charAt(i) + result.charAt(i+1);
i++;
}
else{
var key = result.charAt(i);
}
if(hash[key]){
hash[key] = hash[key] + 1;
}
else{
hash[key] = 1;
}
}
return hash;
}
The above is the detailed content of Sharing code examples on JavaScript parsing chemical formulas. For more information, please follow other related articles on the PHP Chinese website!