Einen einfachen Taschenrechner programmieren

Umwandlung in die Postfix Notation in JavaScript

In JavaScript sähe die Umwandlung in die Postfix Notation wie folgt aus:

// der zu berechnende Term, Klammerung der Punktrechnungen erforderlich
var eingabe = '(2*3)+(4*5)'; 

// Ergebnisspeicher für die Postfix Notation der Eingabe
var postfix = new Array();

// Pufferspeicher für die Operatoren während der Umwandlung
var operatorstack = new Array();

// Fehler im Eingabestring
var fehlerfrei = true;

// Hauptschleife, die so lange ausgeführt wird, bis der Eingabestring leer ist
while (fehlerfrei && eingabe.length) {

    // 1. Prüfung: Ist das erste Zeichen eine Klammer '('
    if (eingabe.match(/^\(/)) {
        // Falls ja, dann ignorieren, bzw. aus dem Eingabestring entfernen
        eingabe = eingabe.substring(1);

    // ansonsten: 2. Prüfung: Handelt es sich zu Beginn des Eingabestrings um eine (ganze) Zahl
    } else if (zahl = eingabe.match(/^[0-9]+/)) {
        // Falls ja, die Zahl in den Ausgabespeicher schreiben
        postfix.push(parseInt(zahl[0]));
        // und aus dem Eingabestring entfernen
        eingabe = eingabe.substring(zahl.length);

    // ansonsten: 3. Prüfung: Handelt es sich zu Beginn des Eingabestrings um einen Operator
    } else if (operator = eingabe.match(/^[\+\-\*\:]/)) {

        // Falls ja, den Operator auf den Operatorstapel legen
        operatorstack.push(operator[0]);
        // und aus dem Eingabestring entfernen
        eingabe = eingabe.substring(1);

    // ansonsten: 4. Prüfung: Handelt es sich zu Beginn des Eingabestrings um eine Klammer ')'
    } else if (eingabe.match(/^\)/)) {

        // Falls ja, dann den obersten Operator aus dem Operatorstapel holen und in den Ausgabespeicher schreiben
        postfix.push(operatorstack.pop());
        // und die Klammer aus dem Eingabestring entfernen
        eingabe = eingabe.substring(1);
        
    // ansonsten wurde ein Zeichen gefunden, mit dem nichts angefangen werden kann: Fehler!
    } else {
   
        // gesonderte Abbruchbedingung der Hauptschleife setzen
        fehlerfrei = false;
    }
}

// Nach Abarbeitung des Eingabestrings ggf. noch verbliebene Operatoren in den Ausgabespeicher verschieben.
while (operatorstack.length) {
    postfix.push(operatorstack.pop());
}

Nach Ausführung dieses Programmteils ist der Eingabestring in ein Feld (Array) umgewandelt worden, bei dem der Term in Postfix Notation vorliegt.

Erläuterungen zum Programmcode

  • Zeilen 14 und 53:  JavaScript interpretiert den Wert 0 als “falsch” (false). Daher kommen die Schleifenbedingungen ohne Vergleichsoperator aus. Alternativ hätte man hier auch “eingabe.length > 0” schreiben können.
  • Zeilen 17, 22, 29 und 37: In diesen Zeilen findet ein Vergleich des Eingabestrings “eingabe” mit einem sogenannten regulären Ausdruck statt. Der reguläre Ausdruck ist zwischen zwei “/” Zeichen vermerkt. Eine detaillierte Erläuterung der regulären Ausdrücke ginge hier zu weit, daher nur die wichtigsten Elemente:
    • ^ am Anfang des regulären Ausdrucks bedeutet, dass hier der zu prüfende String beginnen muss. Der Suchausdruck darf also nicht irgendwo im Text auftauchen, sondern muss am Anfang stehen.
    • [0-9] steht für eine beliebige Ziffer
    • + bedeutet, dass das vorausgehende Element einmal oder mehrfach gefunden werden muss. [0-9]+ steht also für eine beliebige Ziffernfolge
    • Klammern und Rechenoperatoren wie *, +, – und / haben im regulären Ausdruck eine eigene Bedeutung. Möchte man das Zeichen jedoch selber suchen lassen, muss es durch einen Backslash “” maskiert werden.
  • Zeilen 24 und 32: Das Ergebnis der Suche (match), so die Suche erfolgreich war, steht in einem Array. Von Bedeutung ist allerdings nur das erste Ergebnis (mehr sollten auch nicht auftreten), so dass auf das erste Element des Ergebnis Arrays zahl[0], bzw. operator[0] zugegriffen wird.

Hinweis: Dieser vereinfachte Code berücksichtigt nur ganze Zahlen, die vier Grundrechenarten und erfordert eine Klammerung der Punktrechnung.

Vorteil dieser Methode: Die Umwandlung in die Polnische Notation führt zugleich zu einer Prüfung des Eingabestrings, so dass Schadcode weitgehend ausgeschlossen werden kann.

Schreibe einen Kommentar

Nutze dieses Kommentarfeld um deine Meinung oder Ergänzung zu diesem Beitrag kundzutun. Verhalte dich bitte respektvoll und höflich! Kommentare werden vor der Veröffentlichung in der Regel moderiert und bei Verstößen gegen geltendes Recht, die guten Sitten, fehlendem Bezug oder missbräuchlicher Verwendung nicht freigegeben oder gelöscht.
Über die Angabe deines Namens, deiner E-Mail Adresse und deiner Webseite freuen wir uns, doch diese Felder sind optional. Deine E-Mail Adresse wird dabei zu keinem Zeitpunkt veröffentlicht.

Um mit dem Betreiber dieser Seite nicht-öffentlich in Kontakt zu treten, nutze die Möglichkeiten im Impressum.