コードを書くとき、私たちは時々、自分で4つの算術式を解析する必要がある状況に遭遇します。この記事では、JavaScriptの使用を簡単に紹介して、単純な4つの算術式の解析を実装します。
1。コンセプトに精通しています
INFIX表記(またはINFIX表記)は、一般的な算術または論理式表現法です。オペレーターは、オペランドの真ん中にインフィックスの形であります(例:3 + 4)。つまり、最も一般的に使用される算術式を使用します。 Infixの表現は、人間が理解しやすいですが、コンピューター分析では容易ではありません。
逆ポリッシュ表記(RPN、または逆ポリッシュ表記)は、1920年にポーランドの数学者ヤン・ヴカゼビッチによって導入された数学的表現法です。逆ポリッシュ表記では、すべての演算子がオペランドの後ろに配置されるため、接尾辞表記とも呼ばれます。逆ポリッシュ表記では、オペレーターの優先順位を識別するためにブラケットを必要としません。逆ポリッシュ表記は、式を解析して計算するためにスタック構造を使用するのが簡単です。したがって、ここでは、最初にInfix式から逆ポーランド式に変換する4つの要素式を解析します。次に、値を計算します。
2。変換プロセス
Infix式を接尾辞式に変換します(フィールドアルゴリズムのスケジューリング)
1.キューを入力して、マークをポップアップします
2。マークが数字の場合は、出力キューに追加します
3.オペレーター(+ - */)の場合は、出力スタックのスタックの上部にあるオペレーターと比較します。優先順位がスタックの上部にあるオペレーター以下の場合、スタックの上部にあるオペレーターをポップアップして、出力キュー(上記の条件が満たされるまでループ)に追加し、最後にオペレーターをスタックに押し込みます。
4.左ブラケットの場合は、スタックに押し込みます
5.クローズブラケットの場合、オペレーターは常にスタックから飛び出し、出力キューに追加され、スタックの上部にある要素が左ブラケットであることを知っています。左ブラケットがポップアップし、出力キューを追加しません。左ブラケットが見つからない場合、元の式のブラケットが非対称であり、エラーがあることを意味します。
6.入力キューが空で、スタック内にまだ演算子がいる場合、スタックの上部にある演算子がブラケットのままになっている場合、元の式がブラケットを模倣していることを意味します。スタック内のオペレーターを1つずつポップアップし、出力キューに追加します。
7。完了しました
3。コードの実装を変換します
function isoperator(value){var operatorstring = "+ - */()"; return operatorstring.indexof(value)> -1} function getPrioraty(value){switch(value){case '+':case ' - ':return 1; case '*':case '/':return 2;} return 0; getPrioraty(o2);}関数dal2rpn(exp){var inputstack = []; var outputStack = []; var outputQueue = []; 1つ'); while(inputstack.length> 0){var cur = inputstack.shift(); if(isoperator(cur)){if(cur == '('){outputstack.push(cur);} else(cur == ')'){var po = outputstack.pop(); while(po!= '(' && outputstack.length> 0){outputqueue.push(po); po = outputstack.pop();} if(po!= '('){throw "error:unmatched()";}} else { 0){outputqueue.push(outputstack.pop());} outputstack.push(cur);}} else {outputqueue.push(new number(cur));}} console.log( 'step2'); if(outputStack.Length> 0){if(outputStack。= = '= =' outputStack [outputStack.length -1] == '('){shrow "error:unmatched()";} while(outputQueue.push(outputstack.pop());}} console.log( 'step 3'); return outputeue;} console.log( '1 + console(' 1 +) 2 ')); console.log(dal2rpn(' 1 + 2 + 3 ')); console.log(dal2rpn(' 1 + 2 * 3 ')); console.log(dal2rpn(' 1 + 2 * 3-4/5 ')); 2) *(3-4) / 5 '))4。逆ポーランドの発現評価
1.入力キューからマークをポップアップします
2。オペランドの場合は、出力スタックに追加します
3.オペレーターの場合、出力スタックから2つのオペランドをポップして計算し、計算値を出力スタックに押し込みます。
4。ループ操作。入力キューが空で、出力スタックに1つの数値しかない場合、この数値が結果です。そうしないと、不要なオペランドがあります。
5。コードを計算します
function evalrpn(rpnqueue){var outputstack = []; while(rpnqueue.length> 0){var cur = rpnqueue.shift(); if(!isoperator(cur)){outputstack.push(cur);} else {if(outputstack.length <2){throw "un -valid stack"; outputstack.pop(); var fir = outputstack.pop(); outputstack.push(getResult(fir、sec、cur));}} if(outputstack.length!= 1){shrow "unvalid expression";} else {return outputstack [0];}}}}}}6。結論
逆ポーランドの表現は、最初に接触したときにそれに慣れていませんが、それに慣れた後、さまざまな優先順位を持つInfix表現とは異なり、アイデアは実際に非常に単純であり、特に厄介なロジックであるブラケットがあります。逆ポーランドの表現は比較的簡潔であり、優先度を考慮する必要はまったくなく、状況を混乱させるためにブラケットや括弧やブレースを使用する必要はありません。