字符串表达式有四个运算符

时间:2013-11-07 22:31:18

标签: java string operators expression

CS学生在这里。我希望能够采用诸如'2 + 2 * 3 / 2-2'之类的字符串并对其进行评估(= 3)。但我不确定如何构造代码以遵循正确的操作顺序。这是乘法和除法的代码:

int r = 1;
    int n = 0;
    char op = '*';

    for (int i = 0; i < E.length(); i++)
        if (E.charAt(i)=='*'||E.charAt(i)=='/')
        {
            if (op == '*')
                r *= n;
            else
                r /= n;
            n = 0;
            op = E.charAt(i);
        }
        else
            n = n*10 + (E.charAt(i)-'0');

    if (op == '*')
        r *= n;
    else
        r /= n;

    return r;

感谢阅读!

4 个答案:

答案 0 :(得分:2)

使用二叉树,其中每个节点都是算术运算符,叶子是值。

答案 1 :(得分:0)

这正是Interpreter pattern的意图。你的数学运算基本上是一个语法 - 你需要做的只是代表语法。使用Interpreter模式解析数学语句,然后使用它吐出的内容来执行必要的操作。

答案 2 :(得分:0)

使用反向波兰表示法以“计算友好”形式表示您的公式。 您可以在此处阅读有关RPN的信息:http://en.wikipedia.org/wiki/Reverse_Polish_notation

你的2 + 2 * 3 / 2-2的RPN版本将是2 2 3 * 2/2 - +

然后算法是这样的: 假设来自RPN版本的每个符号是符号数组中的元素。 你从数组中获取元素,如果这是一个数字,如果这是一个操作符,则从堆栈中取出两个元素并执行操作。结果应该再次落在堆栈上。重复,直到到达数组的最后一个元素。最后,你的堆栈中只有一个元素就是你的答案。

让我们想象一下: 迭代#符号堆栈内容 1#2 - &gt; 2 2#2 - &gt; 2,2 3#3 - &gt; 3,2,2 4#* - &gt; 6,2 5#2 - &gt; 2,6,2 6#/ - &gt; 3,2 7#2 - &gt; 2,3,2 8# - - &gt; 1,2 9#+ - &gt; 3

答案 3 :(得分:0)

您需要解析表达式。一个简单的递归下降解析器可以做到这一点:

double expression(const char **p) {
    double rv = term(p);
    while (**p) {
        if (**p = '+') {
            ++*p;
            rv += term(p)
        } else if (**p = '-') {
            ++*p;
            rv -= term(p);
        } else
            break; }
    return rv; }

double term(const char **p) {
    double rv = factor(p);
    while (**p) {
        if (**p = '*') {
            ++*p;
            rv *= factor(p)
        } else if (**p = '/') {
            ++*p;
            rv /= factor(p);
        } else
            break; }
    return rv; }

double factor(const char **p) {
    return strtod(p, (char **)&p);
}

当然,以上内容不会处理字符串中的空格,括号或其他您可能关心的内容,但可以相对容易地添加它们。