// ---------------
// PrefixEval.java
// ---------------
import java.util.StringTokenizer;
final class PrefixEval {
/**
* O(n) in space
* O(n) in time
*/
private static long eval (StringTokenizer st) {
final String t = st.nextToken();
final char c = t.charAt(0);
switch (c) {
case '+':
return eval(st) + eval(st);
case '-':
return eval(st) - eval(st);
case '*':
return eval(st) * eval(st);
default:
return Long.parseLong(t);}}
/**
* 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) {
return eval(new StringTokenizer(s));}}
final class PrefixEvalTest {
public static void main (String[] args) {
System.out.println("PrefixEval.java");
assert PrefixEval.eval("2") == 2;
assert PrefixEval.eval("+ 2 3") == 5;
assert PrefixEval.eval("- 2 3") == -1;
assert PrefixEval.eval("* 2 3") == 6;
assert PrefixEval.eval("+ - * 2 3 4 5") == 7;
assert PrefixEval.eval("+ 2 - 3 * 4 5") == -15;
assert PrefixEval.eval("+ 23 45") == 68;
System.out.println("Done.");}}
syntax highlighted by Code2HTML, v. 0.9.1