Я пытаюсь изменить инфикс на постфикс в java, в чем проблема?

Я хочу преобразовать инфикс в постфикс со структурой данных стека.

В этом коде я не рассматривал случаи * и /.


пример ввода: 10 - ( 3 + 4 ) - 1

правильный вывод: 10 3 4 + - 1 -

но мой вывод: 10 3 4 + 1 - -


И это часть моего кода. Я проверил некоторые части, которые, как мне казалось, были неправильными. оператор - это имя стека, который я сделал.

public String infix to (String infix) throws ArrayIndexOutOfBoundsException {
    int result=0;
    arr = infix.split(" ");

    String  element = "";
    String postfix="";
    for(int i=0; i<arr.length; i++) {
        element = arr[i];

        if(element.equals("+")||element.equals("-")) {
            operator.push(element);

        }

        else if(element.equals("(")) {
            operator.push(element);

        }
        else if(element.equals(")")) {

            //**As I think, this part might wrong**

            while((!operator.empty())||(!operator.peek().equals("("))){  
                postfix = postfix.concat(operator.pop());
                postfix = postfix.concat(" ");

                if(operator.peek().equals("(")) {
                    operator.pop(); 
                }
                break;
            }   

            }
        else if(isNum(element)){        
            postfix = postfix.concat(element);
            postfix = postfix.concat(" ");          
        }

    }
    while(!operator.empty()) {
        postfix = postfix.concat(operator.pop());
        postfix = postfix.concat(" ");
    }

    return postfix;
}


public static boolean isNum(String s) {
    try {
        Integer.parseInt(s);
        return true;
    }
    catch(NumberFormatException e) {
        return false;
    }
}

Спасибо вам всем.


person Sienna    schedule 12.10.2018    source источник
comment
Измените это (!operator.empty())||(!operator.peek().equals(()) на (!operator.empty()) && (!operator.peek ().равно(())   -  person suvojit_007    schedule 12.10.2018
comment
@suvojit_007 Пожалуйста, не пишите ответы в комментариях. Пишите ответы как ответы.   -  person Olivier Grégoire    schedule 12.10.2018
comment
@suvojit_007 все еще ошибается..   -  person Sienna    schedule 12.10.2018
comment
@Sienna Можете ли вы опубликовать весь код?   -  person suvojit_007    schedule 12.10.2018
comment
@ suvojit_007 да, но это почти весь код .. ха-ха   -  person Sienna    schedule 12.10.2018


Ответы (1)


Измените это (!operator.empty())||(!operator.peek().equals("(")) на (!operator.empty()) && (!operator.peek().equals("("))

while((!operator.empty()) && (!operator.peek().equals("("))){  
                postfix = postfix.concat(operator.pop());
                postfix = postfix.concat(" ");

                if( (!operator.empty()) && (!operator.peek().equals("("))) {
                    break; //invalid
                else
                   operator.pop(); 
                }

            }    
person suvojit_007    schedule 12.10.2018
comment
@Sienna Вы получаете тот же результат с приведенным выше кодом? - person suvojit_007; 12.10.2018