2010-11-21 1 views
2

J'ai récemment écrit un programme Java qui prend une expression infixe et la convertit en une expression postfixée. Cela fonctionne pour la plupart mais je reçois des sorties fausses pour certaines expressions. Par exemple, l'expression a + b + c + d + e sortira abcde +++++ quand il devrait sortir a b + c + d + e +.Obtenir des sorties erronées dans l'application infix à postfix avec Java

import java.util.Stack; 
public class ITP { 

    public static Stack<Character> stack; 
    public static String inFixExp; 
    public static String postFixExp = ""; 

    public static String infixToPostfix(String exp){ 
     ITP o = new ITP(); 
     stack = new Stack<Character>(); 
     inFixExp = exp; 

     for (int i = 0; i < inFixExp.length(); i++) { 

      if (inFixExp.charAt(i) == '(') 
       stack.push(inFixExp.charAt(i)); 
      else if (inFixExp.charAt(i)==')'){ 
       while (stack.peek()!='('){ 
        postFixExp += stack.pop();  
       } 
       stack.pop(); 
      }else if ((inFixExp.charAt(i)=='*')||(inFixExp.charAt(i)=='/')||(inFixExp.charAt(i)=='+')||(inFixExp.charAt(i)=='-')){ 
       while(!stack.isEmpty() && o.getPredence(inFixExp.charAt(i)) < o.getPredence(stack.peek())) 
        postFixExp += stack.pop(); 
       stack.push(inFixExp.charAt(i)); 
      }else 
       postFixExp += inFixExp.charAt(i); 

     } 
     while(!stack.isEmpty()) 
       postFixExp += stack.pop(); 



     return postFixExp; 
    } 

    public int getPredence(Object op) { 

     if((op.equals("*")) || (op.equals("/"))) 
      return 3; 
     else if((op.equals("+"))||(op.equals("-"))) 
      return 1; 
     else 
      return 0; 
    } 

} 

Je trouve que si je change la < avec < = dans la ligne 24, il va corriger ce problème mais je vais obtenir une erreur de pile vide et d'autres expressions affichera de manière incorrecte, comme a + b * c qui va sortir ab + c *, quand il est censé être abc * +.

Répondre

1

Votre

if ((inFixExp.charAt(i) == '*') || ... 

chèques charAt() mais vos getPredence(precedence?) chèques pour un String, essayez de comparer contre un char à la place.

+0

Merci! ceci l'a réparé parfaitement – Thomas

+0

De rien. Personnellement, j'essaie de ne pas utiliser Object dans les signatures de méthode car le super type Object risque de faire perdre à l'utilisateur la trace de sa frappe. Bien que, dans ce cas, ce n'est pas très pertinent. –

Questions connexes