Я пытаюсь вычислить алгебраические формулы с полными фигурными скобками через стек.
Так, например, у меня была бы эта формула: ((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).
Спасибо!