Получение неверного вывода для инфикса / постфикса в Java с использованием стеков

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

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();
}

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

Другие вопросы по тегам