Beim Schreiben von Code begegnen wir manchmal Situationen, in denen wir die vier arithmetischen Ausdrücke selbst analysieren müssen. In diesem Artikel wird kurz die Verwendung von JavaScript zur Implementierung der Analyse einfacher vier arithmetischer Ausdrücke vorgestellt.
1. mit dem Konzept vertraut
Infix -Notation (oder Infix -Notation) ist eine allgemeine arithmetische oder logische Formel -Repräsentationsmethode. Der Bediener befindet sich in der Form eines Infixes in der Mitte des Operanden (Beispiel: 3 + 4). Das heißt, wir verwenden die am häufigsten verwendeten arithmetischen Ausdrücke. Infix -Ausdrücke sind für Menschen einfacher zu verstehen, sind jedoch für die Computeranalyse nicht einfach.
Reverse polnische Notation (RPN oder inverse polnische Notation) ist eine mathematische Expressionsmethode, die 1920 vom polnischen Mathematiker Jan Vukasevich eingeführt wurde. In der inversen polnischen Notation werden alle Operatoren hinter dem Operanden gelegt, so dass sie auch als Suffix -Notation bezeichnet wird. Inverse polnische Notation erfordert keine Klammern, um die Priorität des Bedieners zu identifizieren. Die inverse polnische Notation kann leicht eine Stapelstruktur verwenden, um den Ausdruck zu analysieren und zu berechnen. Hier analysieren wir die vier Elementausdrücke, die zunächst vom Infix -Expression in den inversen polnischen Ausdruck konvertiert werden. Dann berechnen Sie den Wert.
2. Konvertierungsprozess
Konvertieren Sie einen Infix -Expression in einen Suffix -Expression (Planungsfeldalgorithmus)
1. Geben Sie die Warteschlange ein und geben Sie eine Marke ein
2. Wenn die Marke eine Zahl ist, fügen Sie sie der Ausgangswarteschlange hinzu
3. Wenn es sich um einen Operator (+-*/) handelt, vergleichen Sie ihn mit dem Bediener oben am Stapel im Ausgangsstapel. Wenn die Priorität weniger als oder gleich dem Bediener oben im Stapel ist, popieren Sie den Bediener oben im Stapel und fügen Sie ihn in die Ausgangswarteschlange (Schleife, bis die obigen Bedingungen nicht erfüllt sind), und schieben Sie den Bediener schließlich auf den Stapel.
4. Wenn es sich um eine linke Klammer handelt, schieben Sie sie in den Stapel
5. Wenn es sich um eine enge Halterung handelt, wird der Bediener ständig aus dem Stapel herausgesprungen und zur Ausgangswarteschlange hinzugefügt und weiß, dass das Element oben am Stapel die linke Klammer ist. Die linke Halterung taucht auf und fügt die Ausgangswarteschlange nicht hinzu. Wenn keine linke Klammer gefunden wird, bedeutet dies, dass die Klammern im ursprünglichen Expression asymmetrisch sind und ein Fehler vorliegt.
6. Wenn die Eingangswarteschlange leer ist und es noch Operatoren im Stapel gibt, bedeutet dies, dass der Operator oben im Stapel eine Halterung hat, dies bedeutet, dass der ursprüngliche Ausdruck nicht übereinstimmende Klammern hat. Popieren Sie die Operatoren im Stapel nacheinander und fügen Sie sie der Ausgangswarteschlange hinzu.
7. abgeschlossen
3.. Code -Implementierung konvertieren
function isOperator(value){var operatorString = "+-*/()";return operatorString.indexOf(value) > -1}function getPrioraty(value){switch(value){case '+':case '-':return 1;case '*':case '/':return 2;default:return 0;}}function priority(o1, o2){return getPrioraty(o1) <= getPrioraty (o2);} Funktion Dal2RPN (exp) {var InputStack = []; var outputStack = []; var outputQueue = []; für (var i = 0, len = exp.Length; i <len; i ++) {var cur = exp [i]; if (cur! = ') {{) {) {{{{{{{{{{). wob while (po! 0) {outputQueue.push (outputStack.pop ());} outputStack.push (cur);}} else {outputQueue.push (neue Nummer (cur));}} console.log ('Schritt zwei'); == '(') {throw "Fehler: unpassed ()";} while (outputStack.length> 0) {outputQueue.push (outputStack.pop ());}} console.log ('step drei'); return outputQueue;} console.log (dal2rpn ('1 + 2'); console (dal2rpn ('1 + 2'); 3'));console.log(dal2Rpn('1 + 2 * 3'));console.log(dal2Rpn('1 + 2 * 3 - 4 / 5'));console.log(dal2Rpn('( 1 + 2 )'));console.log(dal2Rpn('( 1 + 2 ) * ( 3 - 4 ) / 5 ')); console.log (dal2rpn (' (1 + 2) * ((3 - 4) / 5) '));4. Inverse polnische Expressionsbewertung
1. Pop Up eine Marke aus der Eingangswarteschlange
2. Wenn es sich um einen Operanden handelt, fügen Sie ihn dem Ausgangsstapel hinzu
3. Wenn es sich um einen Bediener handelt, popfen Sie zwei Operanden aus dem Ausgangsstapel und berechnen Sie und drücken Sie den berechneten Wert in den Ausgangsstapel.
4. Schleifenbetrieb. Wenn die Eingangswarteschlange leer ist und nur eine Zahl im Ausgabestapel vorhanden ist, ist diese Zahl das Ergebnis, andernfalls gibt es einen unnötigen Operanden.
5. Berechnen Sie den Code
Funktion Evalrpn (rpnQueue) {var outputStack = []; while (rpnqueue.length> 0) {var cur = rpnqueue.shift (); if (! isoperator (cur)) {outputStack.push (cur);} else {if (outputStack.länge <2) {Throw "{Wurf)" Wurf) "Wurf" {Wurf "{Wurf" {Wurf "{Wurf" {Wurf "{Wurf" {Wurf "{Wurf) Stapellänge"; = outputStack.pop (); outputStack.push (getResult (fir, sec, cur));}} if (outputStack.length!6. Schlussfolgerung
Die inverse polnische Darstellung wird nicht daran gewöhnt, wenn Sie zum ersten Mal damit in Kontakt kommen, aber nachdem Sie sich damit vertraut gemacht haben, werden Sie feststellen, dass die Idee tatsächlich sehr einfach ist, im Gegensatz zu der Infix -Darstellung, die verschiedene Prioritäten hat, und es gibt Klammern, die besonders problematisch Logik sind. Die inverse polnische Darstellung ist relativ präzise, und es besteht keine Notwendigkeit, Priorität zu berücksichtigen, und es besteht keine Notwendigkeit, Klammern und Klammern und Klammern zu verwenden, um die Situation zu stören.