求解包含括号内的多数字算术表达式的值:迪杰斯特拉双栈方法详解
最编程
2024-02-06 10:38:26
...
利用递归实现的算术表达式求值的算法。算术表达式中没有省略任何括号,每对括号内最多进行一次运算,数字与字符均以空白字符隔开,例如( ( 3 + 2 ) * 4 )。摘自《算法》第四版
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()); } }