Ich arbeite an einem Projekt in Java, bei dem ich einen Infix-Ausdruck in einen Postfix-Ausdruck konvertieren muss. Ich bin derzeit in der Lage, Infix-Ausdrücke mit dieser Methode in Postfix umzuwandeln, solange sie keine Klammern enthalten, aber ich kann nicht herausfinden, wie ich mit Klammern umgehen soll.
Grundsätzlich habe ich zwei Stapel, die Objekte enthalten, die “Token” genannt werden. Ein Token ist eine Wrapper-Klasse, die eine Zeichenfolge enthält, die entweder eine Zahl, eine Variable (die als Zahl ausgewertet wird, abhängig von der Benutzereingabe) oder einen Operator (dem Operator ist eine Prioritätsstufe zugeordnet, damit meine Methode bestimmen kann, wie es geht behandeln die Reihenfolge der Operationen zwischen ‘+’, ‘-‘, ‘*’ und “https://stackoverflow.com/”) oder eine Klammer (die Klammer hat eine Möglichkeit zu bestimmen, ob es sich um eine offene oder eine geschlossene Klammer handelt ).
Wie soll ich mit Klammern umgehen? Was ist mit mehreren Ebenen von Klammern?
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
}
//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());
}
//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();
}
Was Sie haben, ist mehr oder weniger der Dijkstra-Rangierbahnhofalgorithmus, aber ohne die Handhabung von Klammern.
– Benutzer207421
1. November 2013 um 5:19 Uhr
Interessant. Ich suche gerade etwas Literatur dazu!
– CodyJamesCasey
1. November 2013 um 6:57 Uhr