Преобразование Postfix в Infix показывает слишком много скобок в java - PullRequest
0 голосов
/ 03 апреля 2020

Мне нужно кодировать преобразование RPN в Infix в java, но я борюсь с этим довольно много.

Операторы, которые вы можете использовать в выражениях: '=', '>,<' , '+,-', '*,/,%', '^', '~', '(,)'.

Единственный импорт, который я могу использовать, это import java.util.Scanner.

Моя основная проблема заключается в том, что мой алгоритм отображает преобразованное выражение со слишком большим количеством скобок, в то время как я должен отображать их минимальное количество. Для выражения: xabc**= вывод равен x=(a*(b*c)), но должен быть x=a*(b*c).

Я присоединяю свой класс стека и класс основного преобразования. Спасибо за вашу помощь!

public static class Stack<E> {

    private E[] elem;
    public int top;
    Stack(int s) {
        elem = (E[])new Object[s];
        top = -1;
    }
    public void push(E ch) {
        elem[++top] = ch;
    }
    public E pop() {
        E pom = elem[top];
        top--;
        return pom;
    }
    public boolean isEmpty() {
        if (top == -1) return true;
        else return false;
    }
    public int size() {
        return top + 1;
    }
}

public static String onp_do_inf(String onpForm) {

    Stack<String> stos = new Stack<String>(onpForm.length() * 3);
    String operator1 = null, operator2 = null;
    stos.push("0");

    for (int i = 0; i < onpForm.length(); i++) {
        char x = onpForm.charAt(i);
        if (x != '+' && x != '-' && x != '='
                && x != '*' && x != '/'
                && x != '%' && x != '^' && x != '<' && x != '>' && x != '~') {
            stos.push(Character.toString(onpForm.charAt(i)));


        } else if ((stos.size() - 2) > 0) {
            if (x == '~') {
                operator1 = stos.pop();
                stos.push(x + operator1);

            } else {
                operator1 = stos.pop();
                operator2 = stos.pop();
                if ((stos.top == 0 && x == '=')) {
                    stos.push(operator2 + x + operator1);
                }
                else if ( stos.top == 0){
                    stos.push(operator2 + x + operator1);
                }
                else if ((x == '/') || (x == '*' && stos.top > 1)
                        || (x == '%' && stos.top == 1) || (x == '<')
                        || (x == '>') || (x == '^' && stos.top >= 1) || (x == '=')) {
                    stos.push(operator2 + x + operator1);
                } else {
                    stos.push("(" + operator2 + x + operator1 + ")");
                }
            }
        }
    }
    return stos.pop();
}
...