Maison >interface Web >js tutoriel >Partage d'exemples de code sur l'analyse JavaScript des formules chimiques

Partage d'exemples de code sur l'analyse JavaScript des formules chimiques

黄舟
黄舟original
2017-03-18 14:55:153925parcourir

Étant donné une chaîne d'une formule chimique, comptez le nombre d'atomes de chaque élément.

Par exemple :

Molécule d'eau 'H2O', sa composition est de 2 atomes d'hydrogène, 1 atomes d'oxygène, représentés par objet comme {H : 2, O : 1}.

Un autre exemple est l'hydroxyde de magnésium'Mg(OH)2', exprimé sous forme d'objet : {Mg : 1, O : 2 , H:2}.

Prenons-en une plus compliquée 'K4[ON(SO3)2]2', exprimée par {K : 4, O : 14, N : 2, S : 4>.

Dans ces formules moléculaires, il peut y avoir de nombreuses paires de parenthèses, notamment rondes, carrées et bouclées. S'il y a des nombres après les parenthèses, cela indique le nombre d'atomes entre parenthèses. fois pour se multiplier. Par exemple, « Fe(NO3)2 » est composé d'un atome de fer, de deux atomes d'azote et de six atomes d'oxygène.

La difficulté de cette question réside dans le traitement des parenthèses. Il existe trois types de parenthèses. Il y a des imbrications entre parenthèses, et il y a N paires de parenthèses.

//利用进出栈括号相抵,求对应括号的位置
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;
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn