ArithmeticEvaluator.java
import java.util.*;
import java.io.*;
public class ArithmeticEvaluator {
// Klasse zum Berechnen von einfachen Klammerausdrücken
public static int computeExpression(String s) {
// gibt den Wert des Klammerausdrucks im String s zurück
ArithmeticTokenizer tok = new ArithmeticTokenizer(s);
Stack tokenStack = new Stack();
while (tok.hasMoreTokens()) {
// gehe durch die Token durch
Token nextToken = tok.getNextToken();
if (nextToken.getSymbol() != ')') {
tokenStack.push(nextToken);
} else {
// ')' gefunden, also arbeiten!
// 2. Operanden holen
Token t = (Token) tokenStack.pop();
int operand2 = t.getValue();
// Operator holen
t = (Token) tokenStack.pop();
char operator = t.getSymbol();
// 1. Operanden holen
t = (Token) tokenStack.pop();
int operand1 = t.getValue();
// Klammer '(' aus dem Stack beseitigen
tokenStack.pop();
// Ergebnis berechnen und auf den Stack packen
int result = applyOp(operator, operand1, operand2);
tokenStack.push(new Token(result));
}
}
Token t = (Token) tokenStack.pop();
return t.getValue();
}
private static int applyOp(char op, int d1, int d2) {
// berechnet die Operation d1 op d2
switch (op) {
case '+': return d1 + d2;
case '-': return d1 - d2;
case '*': return d1 * d2;
case '/': return d1/d2;
default: throw new IllegalArgumentException();
}
}
public static void main(String[] args) throws IOException {
// kleines Testprogramm
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
// Eingabestring abfragen
String s; // String für eingegebene Zeile
System.out.println("vollständig geklammerten Ausdruck eingeben:");
s = in.readLine();
int result = computeExpression(s);
System.out.println(s + " = " + result);
}
}