1

我有 2 个数组:

int[] values = {1, 2, 3, 4, 5, 6};
int[] operators = {PLUS, MINUS, MULTIPLY, MINUS, DIVIDE, PLUS}  

括号中的大写单词是定义的常量。我想使用相应的运算符(+、-、*、/、+)来评估以下值values array

1 + 2 - 3 * 4 / 5 + 6 = 1 + 2 - (3*4/5) + 6 = 6.6 // expected result

我创建了一个方法(使用 a switch case),基于上述常量来了解我应该使用哪些运算符。

public static int evaluate(int a, int b, int op) {
    int result = 0;
    switch (op) {
    case PLUS:
        result = a + b;
        break;

    case MINUS:
        result = a - b;
        break;
            /* .... */
    }

    return result;
}

但是如您所见,使用此方法结果将是错误的:这就是为什么执行时我得到:

1+2-3*4/5+6 = ((((1+2)-3)*4)/5)+6 = 0*4/5+6 = 0 / 5 + 6 = 0 + 6 = 6 // not the expected result

有人可以帮助我吗?

解决方案:杰瓦尔

@AudriusMeškauskas 的链接包含一个(强大的)库列表。我阅读JEval了功能,我测试了它,它就像一个魅力!

Evaluator evaluator = new Evaluator();
System.out.println("eval : " + evaluator.evaluate("1 + 2 - 3 * 4 / 5 + 6"));

输出6.6

4

2 回答 2

2

Edsger Dijkstra 在 1961 年发布了一个解决方案。它被称为Shutting Yard Algorithm。如果您有兴趣,可以在此处获得原始论文的副本(pdf)。它考虑了运算符的优先级,而不是像您原来的解决方案那样简单地从左到右计算。我怀疑 Evaluator 类使用了 Shutting Yard Algorithm 的一些变体来正确计算解决方案。

于 2013-08-30T20:37:18.187 回答
0

用乘法和除法的计算结果替换所有临时值,最后加/减。

问题不在于源代码的这一部分,您已经扩展了您的应用程序。

您的解决方案将下一个数字与上一个结果相加/减/乘/除。您必须修改计算方法。

例子:

简单的计算器

于 2013-08-30T19:30:48.857 回答