0

Для ввода (1 + 3) * (1 + 3) Я получаю 1 3 + * 1 3 + для вывода, когда он должен быть 1 3 + 1 3 + *. Я отлаживаю и не могу понять, почему умножение не выполняется до конца. Я не сравниваю это в правильном порядке в checkOp()?Получение неверного вывода для infix/postfix в java с использованием стеков

public String infixToPostfix() throws StackEmptyException{ 

    Stack<String> s = new Stack<String>(); 
    String expression = jtfInfix.getText(); 
    String delims = "+-*/()123456789 "; 
    StringTokenizer strToken = new StringTokenizer(expression, delims, true); 
    String result = ""; 

    while(strToken.hasMoreTokens()){ 

     String token = strToken.nextToken(); 

     if(token.equals("(")){ 
      s.push(token); 
     } 
     else if(token.equals(")")){ 

      while(s.peek().equals("(") != true){ 
       result += " " + s.pop(); 
      } 
     }//first elseif 
     else if (checkOp(token)){ 
      if(s.isEmpty() == true) { 
       s.push(token); 
      } 
      else { 
       if(getOrder(token) < findOrder(s.peek())) { 
        result += " " + s.pop(); 
        s.push(token); 
       } 
       else { 
        s.push(token); 
       } 
      } 
     } 
     else { 
      result += " " + token; 
     } 
    } 
    while(s.isEmpty()) { 
     result += s.pop(); 
    } 

    return result; 
}// infixToPostFix() 

public int findOrder(String token) { 
    int order = 0; 
    if((token.equals("+")) || (token.equals("-"))) { 
     order = 1; 
    } 
    else if((token.equals("*")) || (token.equals("%"))) { 
     order = 2; 
    } 
    else if(token.equals(")")) { 
     order = 0; 
    } 
    return order; 
} 

public int getOrder(String token) { 
    int order = 0; 
    if((token.equals("+")) || (token.equals("-"))) { 
     order = 1; 
    } 
    else if((token.equals("*")) || (token.equals("%"))) { 
     order = 2; 
    } 
    return order; 
} 


private boolean checkOp(String token) { 
    return ((token.equals("+")) || (token.equals("-")) || (token.equals("*")) || 
      (token.equals("%")) );    

} 

ответ

1

Есть несколько ошибок

Прежде всего, необходимо вытолкнуть скобку, как только оно было подкреплено

while(s.peek().equals("(") != true){ 
    result += " " + s.pop(); 
} 
s.pop(); // pop the matching left parenthesis 

и вы хотите, чтобы выскочить все из стека после того как вы закончили

while(s.isEmpty()) { 
    result += s.pop(); 
} 

должно быть

while(!s.isEmpty()) { 
    result += " " + s.pop(); 
} 

как запись комментариев полезно для просмотра того, что такое happebing.

+0

Спасибо за предложения, но вывод остается тем же. – H22

+0

@ H22 Ответ BevynQ верен. Приведенный код показывает «1 3 + 1 3 +» с непустым стеком из [(, *, (]). Ваше утверждение о том, что оно выводит «1 3 + * 1 3 +», кажется неправильным. Возможно, вы изменили ваш код после того, как вы разместили вопрос? – Tibrogargan

+0

@ H22 Мне не удалось выполнить репликацию вывода. Мой результат сопоставлен с @Tibrogargan. Я заменил 'jtfInfix.getText()' на '" (1 + 3) * (1 + 3) "' для моего теста – BevynQ