Heim  >  Artikel  >  Java  >  Wie gehe ich mit Klammern bei Infix-zu-Postfix-Konvertierungen um?

Wie gehe ich mit Klammern bei Infix-zu-Postfix-Konvertierungen um?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-17 19:59:02154Durchsuche

How to Handle Parentheses in Infix to Postfix Conversions?

Umgang mit Klammern bei Infix-zu-Postfix-Konvertierungen

Die Konvertierung von Infix-Ausdrücken in Postfix-Ausdrücke erfordert einen sorgfältigen Umgang mit Klammern. Das Vorhandensein von Klammern stellt die Bestimmung der korrekten Reihenfolge der Operationen vor Herausforderungen. Um dieses Problem zu lösen, kann der folgende Ansatz verwendet werden:

Mechanismus für den Umgang mit Klammern

Linke Klammern verschieben: Wenn Sie auf eine linke Klammer stoßen, schieben Sie sie auf den Operatorstapel.

Rechte Klammern verarbeiten: Beim Auftreffen auf ein Recht Klammer:

  1. Operatoren aus dem Stapel entfernen und an die Ausgabezeichenfolge anhängen, bis eine öffnende Klammer gefunden wird.
  2. Wenn der Stapel leer ist, ohne dass eine öffnende Klammer gefunden wird, weist dies auf eine... hin nicht übereinstimmende schließende Klammer.
  3. Wenn eine öffnende Klammer gefunden wird, entfernen Sie sie vom Stapel.
  4. Öffnen Sie die rechte Klammer Klammern aus dem Eingabestapel.

Code-Implementierung

Der folgende Java-Code zeigt, wie die toPostFix()-Methode geändert wird, um Klammern zu verarbeiten:

public String toPostFix() {
    StringBuilder postfixstr = new StringBuilder();

    Stack<Token> in_fix = new Stack<>();
    Stack<Token> post_fix = new Stack<>();

    for (int i = tokens.length - 1; i >= 0; i--) {
        t = new Token(tokens[i]);
        in_fix.push(t);
    }

    //there are still tokens to process
    while (!in_fix.empty()) {
        // is a number
        if (in_fix.peek().type == 1) {     
            postfixstr.append(in_fix.pop().toString());
        } 

        // is an operator and the stack is empty
        else if (in_fix.peek().type == 3 && post_fix.empty()) {   
            post_fix.push(in_fix.pop());
        } 

        // is an operator that has higher priority than the operator on the stack
        else if (in_fix.peek().type == 3 && in_fix.peek().isOperator() > post_fix.peek().isOperator()) {
            post_fix.push(in_fix.pop());
        } 

        // is an operator that has lower priority than the operator on the stack
        else if (in_fix.peek().type == 3 && in_fix.peek().isOperator() <= post_fix.peek().isOperator()) {
            postfixstr.append(post_fix.pop());
            post_fix.push(in_fix.pop());
        } 

        // opening (
        else if (in_fix.peek().type == 4) {   
            post_fix.push(in_fix.pop());
        }

        // closing )
        else if(in_fix.peek().type == 5){
            while(!(post_fix.isEmpty() || post_fix.peek().type == 4)){
                 postfixstr.append(post_fix.pop());
            }
            if (post_fix.isEmpty())
                ; // ERROR - unmatched )
            else
                post_fix.pop(); // pop the (
            in_fix.pop(); // pop the )
        }

        //puts the rest of the stack onto the output string
        if (in_fix.empty()) {
            while (!post_fix.empty()) {
                postfixstr.append(post_fix.pop());
            }
        }
    }

    return postfixstr.toString();
}

By Durch die Umsetzung dieser Schritte kann die toPostFix()-Methode Ausdrücke mit Klammern effektiv verarbeiten, die richtige Reihenfolge der Operationen sicherstellen und das gewünschte Postfix erzeugen Ausdrücke.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit Klammern bei Infix-zu-Postfix-Konvertierungen um?. 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