来自String的java中的表达式评估

时间:2013-12-16 23:06:20

标签: java expression

我想创建一个方法,其中输入是一个String,它是一个方程式,它返回方程的结果。

像这样的东西

String s;
s = "23*14*(15-4)";
System.out.println(ecuation(s));

我找到了一个评估方程式的java程序,但我不知道如何根据我的需要调整它。有人可以帮忙吗?

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());
    }
}

1 个答案:

答案 0 :(得分:1)

您找到的Evaluate程序正在读取表达式中的每个标记(据说来自STDIN)并正在处理它。如果您要重复使用此程序,则需要

  1. 编写一个令牌器,它将从字符串表达式中生成令牌
    • 即。返回“23 * 14 *(15-4)”作为[ 23, *, 13, *, (, 15, -, 4, ) ]
    • 的列表
  2. 重构main方法,使Iterator<String>和迭代器通过它,next()方法返回列表中的下一个标记。
  3. 将list.iterator()从上面#1中生成的列表传递给#2中的重构方法。
  4. HTH。