Вычислить алгебраические формулы с полными фигурными скобками через стек - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь вычислить алгебраические формулы с полными фигурными скобками через стек. Так, например, у меня была бы эта формула: ((6 ∗ (4 + 2)) + (5−1)). Закрывающие скобки являются индикаторами того, что стек должен прекратить «чтение» и вычислить член с помощью набора скобок. Мой стек должен «читать» до первой закрывающей скобки, а затем вычислять форум в пределах (4 + 2), тогда он заметит вторую закрывающую скобку и вычислит это. В моем случае это было бы 6 * 6 (как 4 + 2) было рассчитано ранее. Следующие 5-1 должны быть считаны в стек и рассчитаны, а последние 4 будут добавлены к 36.

Стек реализован следующим образом:

public class Stack<T> {
private List<T> elemente = new ArrayList<T>();

   public void push(T element) {
        elemente.add(element);
    }


    public T pop() {
        if (elemente.size() == 0) {
            throw new IllegalArgumentException("Stack ist leer.");
        }
        T element = elemente.get(elemente.size() - 1);
        elemente.remove(elemente.size() - 1);
        return element;
    }


    public T top() {
        if (elemente.size() == 0) {
            throw new IllegalArgumentException("Stack ist leer.");
        }
        return elemente.get(elemente.size() - 1);
    }

    public T showElems(int i) {
            return this.elemente.get(i);
    }

    public int showSize() {
        return this.elemente.size();
    }

    public boolean isEmpty() {
        return elemente.size() == 0;
    }
    public void clear() {
        elemente.clear();
    }}

Я придумал следующее:

public class Parser {


static Stack<String> stack = new Stack<String>();
static String ausdruck = "( ( 2 * ( 6 *  ( 4 + 2 ) )  ) + ( 6 *  ( 4 + 2 ) ) * ( 8 / 2 )   )  ";
static Scanner s = new Scanner(ausdruck);

public static void main(String[] args) {

    Parser.routine();
    Parser.showErg();
}

public static void berechne() {

    while (!stack.isEmpty() && stack.showSize() > 3) {

        Integer operator1 = Integer.parseInt(stack.pop());
        String operation = stack.pop();
        Integer operator2 = Integer.parseInt(stack.pop());
        stack.pop();

        System.out.println("");
        System.out.println(operator1);
        System.out.println(operation);
        System.out.println(operator2);
        System.out.println("");

        if (operation.equals("+")) {
            stack.push(Integer.toString(operator1 + operator2));
        }
        if (operation.equals("-")) {
            stack.push(Integer.toString(operator2 - operator1));
        }
        if (operation.equals("*")) {
            stack.push(Integer.toString(operator1 * operator2));
        }
        if (operation.equals("/")) {
            stack.push(Integer.toString(operator2 / operator1));
        }

    }
}

public static void printStack() {
    for (int i = 0; i < stack.showSize(); i++) {
        System.out.println(stack.showElems(i) + " --- StackPos ---> " + i);

    }
    System.out.println("");
}

public static void routine() {
    stack.push("ende");

    while (s.hasNext()) {

        String temp = s.next();

        switch (temp) {
        case ")":
            Parser.printStack();
            Parser.berechne();
            break;
        default:
            stack.push(temp);
            break;
        }
    }

    s.close();
}


public static void showErg() {

    String erg = stack.pop();

    System.out.println("Ergebnis : " + erg);
}

}

Моя проблема в том, что, если я добавлю еще одну глубину скобок, мой парсер не будет работать должным образом. Если бы я попробовал следующее вместо вышеприведенной формулы, есть исключение формата числа. Пример, который не работает: ((((6 ∗ (4 + 2)) + (5−1)) * 3).

Спасибо!

1 Ответ

0 голосов
/ 13 мая 2018

Хорошо, в общем, лучше, если вы пишете на английском языке, потому что это делает его более понятным, что делает ваш код. Во-вторых, вы не используете стек, но вы используете очередь LIFO, в то время как стек - очередь FIFO. Это также довольно запутанно. Чтобы добраться до вашего вопроса. Вы подходите для - в вашем коде, который является символом Unicode 45, В то время как на входе вы используете - какой у вас немного больше минус? который является символом Unicode 8722. Также, пожалуйста, измените ваш код для работы с символами вместо строк, так как теперь вам нужно везде добавлять пробелы :)

...