Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /******************************************************************************
- * Compilation: javac Evaluate.java
- * Execution: java Evaluate
- * Dependencies: Stack.java
- *
- * Evaluates (fully parenthesized) arithmetic expressions using
- * Dijkstra's two-stack algorithm.
- *
- * % java Evaluate
- * ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) )
- * 101.0
- *
- * % java Evaulate
- * ( ( 1 + sqrt ( 5 ) ) / 2.0 )
- * 1.618033988749895
- *
- *
- *
- * Remarkably, Dijkstra's algorithm computes the same
- * answer if we put each operator *after* its two operands
- * instead of *between* them.
- *
- * % java Evaluate
- * ( 1 ( ( 2 3 + ) ( 4 5 * ) * ) + )
- * 101.0
- *
- * Moreover, in such expressions, all parentheses are redundant!
- * Removing them yields an expression known as a postfix expression.
- * 1 2 3 + 4 5 * * +
- *
- *
- ******************************************************************************/
- public class Evaluate {
- public static void main(String[] args) {
- Stack<String> ops = new Stack<String>();
- Stack<Double> vals = new Stack<Double>();
- while (!StdIn.isEmpty()) {
- String s = StdIn.readString();
- if (s.equals("(")) ;
- else if (s.equals("+")) ops.push(s);
- else if (s.equals("-")) ops.push(s);
- else if (s.equals("*")) ops.push(s);
- else if (s.equals("/")) ops.push(s);
- else if (s.equals("sqrt")) ops.push(s);
- else if (s.equals(")")) {
- String op = ops.pop();
- double v = vals.pop();
- if (op.equals("+")) v = vals.pop() + v;
- else if (op.equals("-")) v = vals.pop() - v;
- else if (op.equals("*")) v = vals.pop() * v;
- else if (op.equals("/")) v = vals.pop() / v;
- else if (op.equals("sqrt")) v = Math.sqrt(v);
- vals.push(v);
- }
- else vals.push(Double.parseDouble(s));
- }
- StdOut.println(vals.pop());
- }
- }
Add Comment
Please, Sign In to add comment