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);
  }
}