Разделите выражение инфикса рекурсивным методом - PullRequest
0 голосов
/ 18 сентября 2018

я пытаюсь создать рекурсивный метод для разделения строки, которая является выражением инфикса, я использую 2 очереди и 1 стек для использования алгоритма шунтирования-ярда , проблема в том, что я запутался, разделяя инфиксвыражение из скобок, например:

3 + (12+ (8/2)) -> 3+ | (12+ | (8/2) |) |

У меня уже есть код, чтобы переписать выражение в postfix, а затем оценить выражение, но я хочу сделать рекурсивный метод, который сначала переписывает выражение в скобках для обозначения приоритета, не принимая скобки:

(8/2) ---> 8/2 ---> 82 /

это то, что я мог сделать, но я очень запутался в своем рекурсивном методе, оченьблагодарны за любую помощь или совет, который вы, ребята, могли бы дать мне:

public class infijoToPosfijo {

private static int preference(String op) {
    int prf = 0;
    if (op.equals("*") || op.equals("/") || op.equals("%")) {
        prf = 2;
    }
    if (op.equals("+") || op.equals("-")) {
        prf = 1;
    }
    return prf;
}

public String Recursive(String Recursive) {

    IterableQueueListas<String> input= new IterableQueueListas<>();
    IterableQueueListas<String> output = new IterableQueueListas<>();
    IterableStacksListas<String> stack = new IterableStacksListas<>();

    String infix="";
    String separate[] = infix.split("(?=[-+*/%()])|(?<=[^-+*/%][-+*/])|(?<=[()])");

    for (int i = 0; i < separate.length; i++) {

        if (separate[i] == "(") {
            int a = 0;

            do {

                if (separate[i].equals("(")) {
                    a++;

                }
                if (separate[i].equals(")")) {
                    a--;

                }
                input.enqueue(separate[i]);

            } while (a != 0);
            for (String item : input) {
                Recursive = input.dequeue();
            Recursive(Recursive);
        }
        input.enqueue(separate[i]);

    }

    for (String item : input) {
        String s = input.dequeue();

        if (!s.equals("+")) {
            if (!s.equals("-")) {
                if (!s.equals("*")) {
                    if (!s.equals("/")) {
                        if (!s.equals("%"))
                            output.enqueue(s);
                    }
                }
            }
        }

        if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/") || s.equals("%")) {
            if (stack.isEmpty()) {
                stack.push(s);
            } else if (preference(s) > preference(stack.ver())) {
                stack.push(s);
            } else if (preference(s) <= preference(stack.ver())) {

                String auxDos = stack.pop();
                output.enqueue(auxDos);
                stack.push(s);
            }
        }

    }
    for (String item : stack) {
        output.enqueue(stack.pop());
    }

    input = output;

    for (String item : input)
        System.out.print(item + " ");

    System.out.println();

    // Evaluate infix expression



    for (String item : output) {

        String s = input.dequeue();
        if (!s.equals("+")) {
            if (!s.equals("-")) {
                if (!s.equals("*")) {
                    if (!s.equals("/")) {
                        if (!s.equals("%")) {
                            stack.push(s);
                            System.out.println("Sending the " + s + " to the stack");
                        }
                    }
                }
            }
        }
        if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/") || s.equals("%")) {
            String y = stack.pop();
            String x = stack.pop();
            System.out.println("Operation " + x + " y " + y);
            if (s.equals("+")) {
                System.out.println("Add the numbers");
                int r = Integer.parseInt(x) + Integer.parseInt(y);
                stack.push(String.valueOf(r));
            }
            if (s.equals("-")) {
                System.out.println("Subtract the numbers");
                int r = Integer.parseInt(x) - Integer.parseInt(y);
                stack.push(String.valueOf(r));
            }

            if (s.equals("*")) {
                System.out.println("Multiply the numbers");
                int r = Integer.parseInt(x) * Integer.parseInt(y);
                stack.push(String.valueOf(r));
            }
            if (s.equals("/")) {
                System.out.println("se dividen los numeros");
                int r = Integer.parseInt(x) / Integer.parseInt(y);
                stack.push(String.valueOf(r));

            }
            if (s.equals("%")) {

                System.out.println("Modulus between the numbers");
                int r = Integer.parseInt(x) % Integer.parseInt(y);
                stack.push(String.valueOf(r));

            }
        }
    }

    return stack.pop();}
    return infix;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...