2013-09-10 1 views
0

В настоящее время я делаю конвертер infixToPostfix, который будет использоваться в назначении калькулятора. Моя проблема заключается в том, что вывод, кажется, показывает скобки, когда этого не должно быть. Я застрял в этом. Может кто-то помочь мне? Благодарю.Infix to Postfix Converter с круглыми скобками

import java.util.ArrayList; 
import java.util.Stack; 

class infixToPostfix{ 

    Stack<String> stack; 
    ArrayList<String> operators; 

    String postFix; 

    int[] operand = {-1, -1, 1}; 
    int[] plusorminus = {1,2,-1}; 
    int[] timesordivide = {3,4,-1}; 
    int[] raiseto = {6,5,-1}; 
    int[] openparenthesis = {-1,0,-1}; 

    public infixToPostfix(String infix) { 

     stack = new Stack<String>(); 
     operators = new ArrayList<String>(); 

     operators.add("+"); 
     operators.add("-"); 
     operators.add("x"); 
     operators.add("/"); 
     operators.add("^"); 
     operators.add("("); 
     operators.add(")"); 

     postFix = new String(); 

     while(infix.length() > 1){ 

      String operand = new String(); 
      String operator = new String(); 

      if(!operators.contains(infix.substring(0, 1))){ 
       while(!operators.contains(infix.substring(0, 1)) && !infix.isEmpty()){ 
        operand = infix.substring(0,1); 
        infix = infix.substring(1); 
       } 
       postFix = postFix + operand; 
      } 
      else if(operators.get(5).equals(infix.substring(0, 1))){ 
       stack.push(infix.substring(0, 1)); 
       infix = infix.substring(1); 
      } 
      else if(operators.get(6).equals(infix.substring(0, 1))){ 
       while(!stack.peek().equals("(")){ 
        postFix = postFix + stack.pop(); 
       } 
       stack.pop(); 
       infix = infix.substring(1); 
      } 
      else{ 
       operator = infix.substring(0,1); 

       int[] current = getICPandISP(operator); 

       if(!stack.isEmpty()){ 
        int[] top = getICPandISP(stack.peek()); 
        while(current[0] < top[1] && !stack.isEmpty()){ 
         postFix = postFix + stack.pop(); 
         if(!stack.isEmpty()) 
          top = getICPandISP(stack.peek()); 
        } 
       } 
       stack.push(operator); 
       infix = infix.substring(1); 
      } 
     } 
     postFix = postFix + infix; 

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

    public String toString(){ 
     return postFix; 
    } 

    private int[] getICPandISP(String operator){ 
     if(operator.equals("+") || operator.equals("-")){ 
      return plusorminus; 
     } 
     else if(operator.equals("x") || operator.equals("/")){ 
      return timesordivide; 
     } 
     else if(operator.equals("^")){ 
      return raiseto; 
     } 
     else{ 
      return openparenthesis; 
     } 
    } 

    public static void main(String[] args){ 
     infixToPostfix convert = new infixToPostfix("A+B/C-(A/D)*(A+(C-E^F))"); 
     System.out.println(convert); 
    } 

} 
+1

Это как четвертый вопрос на этой неделе о преобразовании инфикса в постфикс. Должен быть какой-то класс, который только что назначил это, в котором никто действительно не знает, как программировать. – AJMansfield

ответ

1

В коде есть две незначительные ошибки. Во-первых, вы пропускаете последний символ в выражении - который, как выясняется, является правая скобка:

while(infix.length() > 1){ //should be infix.length() > 0 
    // .... 
} 

Во-вторых, ваш код используется 'x' как оператор умножения, в то время как ваше выражение использует '*'.

+0

Yay! Это сработало. Благодаря :))) –