/**
 * AlgoDat SS00 Aufgabe 48
 * Auswertung vollstaendig geklammerter(!) Ausdruecke mittels
 * einem Stack und Umwandlung in Postfix-Notation.
 * 
 * @author Christian Semrau, 29.04.2000
 * <a href="mailto:Christian.Semrau@student.uni-magdeburg.de">
 * Christian.Semrau@student.uni-magdeburg.de</a>
 */
class ChS_Aufg48 {
/**
 * Berechnet einen RPN-Ausdruck.
 */
public static String evaluateRPN(String rpn) {
    MyStack stack = new MyStack();
    while (rpn.length()>0){
        int p = rpn.indexOf(" ");
        char c = rpn.charAt(0);
        switch(c){
            case '+': case '-': case '*': case '/':
                int v2 = Integer.parseInt((String)stack.pop());
                int v1 = Integer.parseInt((String)stack.pop());
                int v = c=='+'?v1+v2:c=='-'?v1-v2:c=='*'?v1*v2:c=='/'?v1/v2:0;
                stack.push(""+v);
                rpn = rpn.substring(2);
                break;
            default:
                stack.push(rpn.substring(0, p));
                rpn = rpn.substring(p+1);
                break;
        }
    }
    return (String)stack.pop();
}
public static void main(String[] args) {
    String eingabe;
    String rpn;
    String ausgabe;

    eingabe = "((9+8)*(4*6))";
    rpn = toRPN(eingabe);
    ausgabe = evaluateRPN(rpn);

    System.out.println(eingabe);
    System.out.println(rpn);
    System.out.println(ausgabe);
}
/**
 * Wandelt einen vollstaendig geklammerten Ausdruck in RPN um.
 * Versagt, wenn Klammern fehlen oder redundante Klammern angegeben sind.
 * @param eingabe java.lang.String
 */
public static String toRPN(String eingabe) {
    MyStack stack = new MyStack();
    String ausgabe = "";
    while (eingabe.length()>0){
        char c = eingabe.charAt(0);
        switch(c){
            case '+': case '-': case '*': case '/':
                stack.push(""+c);
            case ' ': case '(':
                eingabe = eingabe.substring(1); break;
            case ')':
                ausgabe += stack.pop()+" ";
                eingabe = eingabe.substring(1); break;
            default:
// Variante die ohne Leerzeichen hinter den Zahlen auskommt
                while (c>='0' && c<='9' && eingabe.length()>1){
                    ausgabe += c;
                    eingabe = eingabe.substring(1);
                    c = eingabe.charAt(0);
                }
                ausgabe += " ";
// Variante die Leerzeichen hinter den Zahlen verlangt
//                int p = eingabe.indexOf(" ");
//                ausgabe += eingabe.substring(0, p)+" ";
//                eingabe = eingabe.substring(p+1);
                break;
        }
    }
    return ausgabe;
}
}