Heim >Web-Frontend >js-Tutorial >Teilen von Codebeispielen zum Parsen chemischer Formeln in JavaScript

Teilen von Codebeispielen zum Parsen chemischer Formeln in JavaScript

黄舟
黄舟Original
2017-03-18 14:55:153924Durchsuche

Zählen Sie anhand einer Zeichenfolge einer chemischen Formel die Anzahl der Atome jedes Elements.

Zum Beispiel:

Wassermolekül 'H2O', seine Zusammensetzung ist 2 Wasserstoffatome, 1 Sauerstoffatome, dargestellt durch Objekt als {H: 2, O: 1}.

Ein weiteres Beispiel ist Magnesiumhydroxid'Mg(OH)2', ausgedrückt als Objekt: {Mg: 1, O: 2 , H: 2}.

Nehmen wir eine kompliziertere Formel 'K4[ON(SO3)2]2', ausgedrückt als {K: 4, O : 14, N: 2, S: 4}.

In diesen Molekülformeln kann es viele Klammerpaare geben, einschließlich runder, eckiger und geschweifter Klammern. Wenn den Klammern Zahlen folgen, gibt dies die Anzahl der Atome in den Klammern an mal zu vermehren. „Fe(NO3)2“ besteht beispielsweise aus einem Eisenatom, zwei Stickstoffatomen und sechs Sauerstoffatomen.

Die Schwierigkeit dieser Frage liegt in der Verarbeitung von Klammern. Es gibt drei Arten von Klammern, und es gibt N Klammerpaare.

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

Das obige ist der detaillierte Inhalt vonTeilen von Codebeispielen zum Parsen chemischer Formeln in JavaScript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn