2016-05-08 15 views
0

Ich versuche, ein Postfix in ein Infix umzuwandeln. Ich habe einen Code, aber ich kann ihn nicht beheben. Es kann eine Bedingung geben, die ich vermisse. Oder meine Struktur ist nicht ganz richtig. Auch da ich neu in Java bin, brauche ich vielleicht Hilfe mit "Stack<Character>".Postfix zu Infix

public static String postfixToInfix(String postfix) { 
    Stack<Character> stack = new Stack(); 
    Stack<Character> backup = new Stack(); 
    StringBuilder infix = new StringBuilder(postfix.length()); 
    infix.append('('); 
    for (int i = 0; i < postfix.length(); i++) { 
     if (!isOperator(postfix.charAt(i))) { 
      stack.push(postfix.charAt(i)); 
     } else { 
      if (stack.size() == 1) {        //stack is 1 
       backup.push(postfix.charAt(i)); 
      } 
      if (stack.size() == 0 && backup.size()%5 == 0) {  //stack is 0 
       stack.push(backup.pop()); 
       stack.push(backup.pop()); 
       stack.push(backup.pop()); 
       stack.push(backup.pop()); 
       stack.push(backup.pop()); 
       stack.push(postfix.charAt(i)); 
      } 
      if (stack.size() >= 2) {        //stack is > 1 
       char arg2 = stack.pop(); 
       char arg1 = stack.pop(); 
       backup.push(')'); 
       backup.push(arg2); 
       backup.push(postfix.charAt(i)); 
       backup.push(arg1); 
       backup.push('('); 
      } 
     } 
    } 

    while (!backup.empty()) { //only size 3 
     stack.push(backup.pop()); 
    } 
    while (!stack.empty()) { //only size 3 
     backup.push(stack.pop()); 
    } 
    while (!backup.isEmpty()) { 
     infix.append(backup.pop()); 
    } 
    infix.append(')'); 
    return infix.toString(); 
} 

private static boolean isOperator(char c) { 
     return c == '+' || c == '-' || c == '*' || c == '/' || c == '^' || c == '(' || c == ')'; 
    } 

public static void main(String[] args) { 
     String infix1 = "(3-(7*2))"; 
     String postfix1 = "372*-"; 
     String infix2 = "((7+1)*((3-6)*(5-2)))"; 
     String postfix2 = "71+36-52-**"; 

     System.out.println("    postfix1: " + postfix1); 
     s = postfixToInfix(postfix1); 
     System.out.println("postfixToInfix(postfix1): " + s); 
     if (s.equals(infix1)) { 
      System.out.println("      Korrekt!"); 
     } else { 
      System.out.println("      Nicht korrekt!"); 
     } 
     System.out.println(); 

     System.out.println("    postfix2: " + postfix2); 
     s = postfixToInfix(postfix2); 
     System.out.println("postfixToInfix(postfix2): " + s); 
     if (s.equals(infix2)) { 
      System.out.println("      Korrekt!"); 
     } else { 
      System.out.println("      Nicht korrekt!"); 
     } 
     System.out.println(); 
    } 
} 

Ausgabe

   postfix1: 372*- 
postfixToInfix(postfix1): (3-(7*2)) 
         Korrekt! 

       postfix2: 71+36-52-** 
postfixToInfix(postfix2): ((5(-*2)()**)(3-6)(7+1)) 
         Nicht korrekt! 


Process finished with exit code 0 
+1

Also im Grunde, Ihr Code verhält sich nicht so, wie Sie es erwarten sollten, und Sie haben keine Ahnung warum. In dieser Situation müssen Sie ein Debugging durchführen, am besten mit einem Debugger, oder wenn Sie möchten, mit vielen println-Anweisungen, die im gesamten Code verstreut sind, aber der Schlüssel ist, dass Sie den Status Ihrer Schlüsselvariablen als Code kennen müssen läuft, um dir einen Hinweis darauf zu geben, was falsch sein könnte. –

+0

Ich habe debuggen. Im Grunde sitze ich zwei Tage hier und möchte weiter gehen, weil ich zwei andere Aufgaben habe. Ich habe dies auch als Pseudo-Code geschrieben, um die Probleme mit Java selbst zu vermeiden. Nichts half bisher. – LSR

+0

Wenn Sie Fehler behoben haben, zeigen Sie bitte die Früchte dieser Bemühungen. Wie geschrieben, befürchte ich, dass Ihre Frage zu vage und zu weit gefasst ist und die Gefahr besteht, dass sie geschlossen wird. –

Antwort

3

Statt mit der Klammer und allem als separate Einträge im Stapel des Umgangs Sie Strings verwenden könnten den Prozess zu vereinfachen:

private static boolean isOperator(char c) { 
    return c == '+' || c == '-' || c == '*' || c == '/' || c == '^'; 
} 

public static String postfixToInfix(String postfix) { 
    Stack<String> s = new Stack<String>(); 
    for (char c : postfix.toCharArray()) { 
     if (isOperator(c)) { 
      String temp = s.pop(); 
      s.push('(' + s.pop() + c + temp + ')'); 
     } else { 
      s.push(String.valueOf(c)); 
     } 
    } 
    return s.pop(); 
} 
+0

Wow. Vielen Dank. Ich habe etwas Neues gelernt. Ich wusste nicht über den Stack (Wie ich schon sagte - Java-Neuling). Ich werde versuchen, es auch auf die restlichen Aufgaben anzuwenden. Nochmals vielen Dank. – LSR