2017-10-21 5 views
0

Mein Code konvertiert einen Infix-Ausdruck erfolgreich in einen Postfix-Ausdruck. Wenn ich jedoch eine Zahl einfüge, die mehr als 1 Ziffer ist (z. B. 546), erhält man keine Leerzeichen zwischen dieser Zahl und dem rechten Operanden.Fehlende Leerzeichen in der Postfix-Ausdrucksausgabe - Java

Ein Testlauf meines Code: Input: Geben Sie einen Ausdruck: (24/4)/(15/3) * 10-4 + 2 Output: Die Postfix Expression ist: 244/153// 10 * 4 - 2+

ich mag würde es der Postfix Ausdruck ist zu sein: 24 15.04 3// 10 * 4 - 2+

Dies ist mein Code: Bitte machen sie alle Änderungen, die mir erlauben, um Leerzeichen in die Ausgabe einzufügen.

import java.util.*; 

public class PostfixConversion { 

    public static void main(String args[]) { 

     System.out.print("Enter an expression: "); 
     String infix = new Scanner(System.in).nextLine(); 

     System.out.println(convertToPostfix(infix)); 

    } 


    public static boolean precedence(char first, char second) 
    { 
     int v1 = 0, v2 = 0; 
     //find value for first 
     if(first == '-' || first == '+'){ 
     v1 = 1; 
     }else if(first == '*' || first == '/'){ 
     v1 = 2;  
     }//end if 

     //find value for second 
     if(second == '-' || second == '+'){ 
     v2 = 1; 
     }else if(second == '*' || second == '/'){ 
     v2 = 2;  
     }//end if 

    if(v1 < v2){ 
     return false; 
    }//end if 

    return true; 
    }//end precedence method 

//converts infix expression into postfix expression 
public static String convertToPostfix(String infixExp) 
    { 
    String postFix = "The Postfix Expression is: "; 
    Stack<Character> stack = new Stack<Character>(); 
    char character = ' '; 

    for(int i = 0; i < infixExp.length(); i++) 
    { 
     character = infixExp.charAt(i); 

     //determine if character is an operator 
     if(character == '*' || character == '-' || character == '/' || character == '+') 
     { 
      while(!stack.empty() && precedence(stack.peek(), character)){ 
       postFix += stack.pop(); 
      }//end while 
      stack.push(character); 
     } 
     else if(character == '(') //check for left parenthesis 
     { 
      stack.push(character); 
     } 
     else if (character == ')') 
     { 
      while(!stack.peek().equals('(') && !stack.isEmpty()){ //add characters until left parenthesis 
       postFix += stack.pop(); 
      }//end while 

      if(!stack.isEmpty() && stack.peek().equals('(')){ 
       stack.pop(); // pop/remove left parenthesis 
      } 
     } 
     else 
     { 
      postFix += character; 
     }//end if 
    }//end for 
    while(!stack.empty()) //add the remaining elements of stack to postfix expression 
    { 
     if(stack.peek().equals('(')) 
     { 
      postFix = "There is no matching right parenthesis."; 
      return postFix; 
     } 
     postFix += stack.pop(); 
    } 
     return postFix; 
}//end convertToPo 
} 
+1

[Was a Debugger und wie kann es mir helfen, Probleme zu diagnostizieren?] (https://stackoverflow.com/q/25385173/5221149) – Andreas

+0

Suchen Sie einige vorhandene Implementierungen des Djkstra Rangierbahnhof-Algorithmus, um zu sehen, wie die 'precedence()' Methode sollte wirklich sein implementiert. Es ist nicht annähernd so kompliziert wie du es gemacht hast. – EJP

Antwort

0

Die Lösung ist hier eine Linie hinzuzufügen (Code Kommentar sehen):

if(character == '*' || character == '-' || character == '/' || character == '+') 
{ 
    postFix += ' '; // <-- add space here 
    while(!stack.empty() && precedence(stack.peek(), character)){ 
     postFix += stack.pop(); 
    }//end while 
    stack.push(character); 
} 

nach dem Auftragen der die Ausgabe beheben auf meinem Rechner wie folgt aussieht:

The Postfix Expression is: 24 4/ 15 3//10 * 4 - 2+ 
Verwandte Themen