// ----------------
// PostfixEval.java
// ----------------

import java.util.Stack;
import java.util.StringTokenizer;

final class PostfixEval {
    /**
     * O(n) in space
     * O(n) in time
     * Precondition: s.length() > 0
     * Precondition: ((s.charAt(i) >= '0') && (s.charAt(i) <= '9')) || (s.charAt(i) == '[ +-*]')
     * expr -> expr expr +
     *      |  expr expr -
     *      |  expr expr *
     *      |  number
     */
    public static long eval (String s) {
        final StringTokenizer st = new StringTokenizer(s);
        final Stack<Long>     sl = new Stack<Long>();
        while (st.hasMoreTokens()) {
            final String t = st.nextToken();
            final char   c = t.charAt(0);
            switch (c) {
                case '+': {
                    final long v = sl.pop();
                    final long w = sl.pop();
                    sl.push(w + v);
                    break;}
                case '-': {
                    final long v = sl.pop();
                    final long w = sl.pop();
                    sl.push(w - v);
                    break;}
                case '*': {
                    final long v = sl.pop();
                    final long w = sl.pop();
                    sl.push(w * v);
                    break;}
                default:
                    sl.push(Long.parseLong(t));}}
        return sl.pop();}}

final class PostfixEvalTest {
    public static void main (String[] args) {
        System.out.println("PostfixEval.java");

        assert PostfixEval.eval("2")             ==   2;
        assert PostfixEval.eval("2 3 +")         ==   5;
        assert PostfixEval.eval("2 3 -")         ==  -1;
        assert PostfixEval.eval("2 3 *")         ==   6;
        assert PostfixEval.eval("2 3 * 4 - 5 +") ==   7;
        assert PostfixEval.eval("2 3 4 5 * - +") == -15;
        assert PostfixEval.eval("23 45 +")       ==  68;

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


syntax highlighted by Code2HTML, v. 0.9.1