Obsługa nawiasów podczas konwertowania wyrażeń infix do wyrażeń postfix

Pracuję nad projektem w Javie, który wymaga ode mnie przekonwertowania wyrażenia infix na wyrażenie postfix. Obecnie jestem w stanie konwertować wyrażenia infix do postfix za pomocą tej metody, o ile nie zawierają nawiasów, ale nie mogę zrozumieć, jak obsługiwać nawiasy.

Zasadniczo mam dwa stosy, które przechowują obiekty o nazwie „Token”. Token jest klasą opakowującą, która przechowuje ciąg znaków, który jest liczbą, zmienną (która jest oceniana jako liczba, oczekująca na dane wprowadzone przez użytkownika), operatorem (operator ma przypisany poziom priorytetu, tak że moja metoda może określić, jak obsługiwać kolejność operacji między „+”, „-”, „*” i „/”) lub nawias (nawias ma sposób na określenie, czy jest to otwarty nawias, czy zamknięty nawias).

Jak powinienem postępować z nawiasami? A co z wieloma warstwami nawiasów?

public String toPostFix() {
    StringBuilder postfixstr = new StringBuilder();

    Stack<Token> in_fix = new Stack<>();
    Stack<Token> post_fix = new Stack<>();

    for (int i = tokens.length - 1; i >= 0; i--) {
        t = new Token(tokens[i]);
        in_fix.push(t);
    }

    //there are still tokens to process
    while (!in_fix.empty()) {
        //is a number
        if (in_fix.peek().type == 1) {     
            postfixstr.append(in_fix.pop().toString());
        } 

        //is an operator and the stack is empty
        else if (in_fix.peek().type == 3 && post_fix.empty()) {   
            post_fix.push(in_fix.pop());
        } 

        // is an operator that has higher priority than the operator on the stack
        else if (in_fix.peek().type == 3 && in_fix.peek().isOperator() > post_fix.peek().isOperator()) {
            post_fix.push(in_fix.pop());
        } 

        // is an operator that has lower priority than the operator on the stack
        else if (in_fix.peek().type == 3 && in_fix.peek().isOperator() <= post_fix.peek().isOperator()) {
            postfixstr.append(post_fix.pop());
            post_fix.push(in_fix.pop());
        } 

        //puts the rest of the stack onto the output string
        if (in_fix.empty()) {
            while (!post_fix.empty()) {
                postfixstr.append(post_fix.pop());
            }
        }
    }

    return postfixstr.toString();
}

questionAnswers(2)

yourAnswerToTheQuestion