2015-11-17 6 views
-1

привет всем, у меня есть инфикс для постфиксного конвертера здесь. Это преобразованиеinfix to postifx converter

4 - 9 * 11 + 155 * (21 - 17)/ 3 

в

4 9 11 155 21 17 3 - * + * - 

так, что довольно близко. Правильно для более коротких выражений. Есть предположения?

public class ExpressionTools { 
    static MyStack<String> operatorStack=new MyStack<String>(); 
    public static String infixToPostfix(String infix)throws Exception{ 
    Scanner tokenizer = new Scanner (infix); 
     System.out.println("hi"); 
     String postFixExpression=""; 
     while (tokenizer.hasNext()){ 

      String temp=tokenizer.next(); 
      if(temp.charAt(0)>=48&&temp.charAt(0)<=57){ 
       for(int i=0; i<temp.length(); i++){ 
        if(!Character.isDigit(temp.charAt(i))){ 
         throw new PostFixException("Invalid expression"+temp); 
       } 
       } 
       postFixExpression+=temp+" "; 
      } 

      else if(temp.equals('(')){ 
       operatorStack.push(temp); 
      } 
      else if(temp.equals("*")||temp.equals("+")||temp.equals("-")||temp.equals("/")){ 
       if(!operatorStack.isEmpty()){ 
        while(operatorStack.isEmpty()&&operatorStack.peek().equals("*")||operatorStack.isEmpty()&&operatorStack.peek().equals("/")){ 
         postFixExpression+=operatorStack.pop()+" "; 

        } 
       } 
       operatorStack.push(temp); 
      } 
      else if(temp.equals(")")){ 
       while(!operatorStack.isEmpty()){ 
        if(!operatorStack.peek().equals("(")){ 
         postFixExpression+=operatorStack.pop()+" "; 
        } 
        else{ 
         operatorStack.pop(); 
         break; 
        } 

       } 
      } 
      System.out.println(postFixExpression); 
     } 


      while(!operatorStack.isEmpty()){ 
       postFixExpression+=operatorStack.pop()+" "; 
      } 



    System.out.println("final postfix"); 
    System.out.println(postFixExpression); 
    return postFixExpression; 
} 
+0

Вы прошли через этот код в своем отладчике? –

ответ

0

У вас есть несколько проблем.

  1. operatorStack.isEmpty()&&operatorStack.peek().equals("*") никогда не может быть правдой.

  2. operatorStack.isEmpty()&&operatorStack.peek().equals("/") никогда не может быть правдой.

  3. else if(temp.equals('(')){ должно быть else if(temp.equals("(")){.

  4. Ваш токенизатор не содержит ) от /. Вам нужно либо добавить пробел после ), либо использовать лучший токенизатор.

+0

большое спасибо – drt