Java 带四个运算符的字符串表达式

Java 带四个运算符的字符串表达式,java,string,operators,expression,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 == '*'

这里是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;
intr=1;
int n=0;
char op='*';
对于(int i=0;i

谢谢你的阅读

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

这正是。你的数学运算基本上是一种语法——你所需要做的就是表示这种语法。使用解释器模式解析您的数学语句,然后使用它吐出的内容执行必要的操作。

使用反向波兰符号以“计算友好”的形式表示您的公式。 您可以在此处阅读有关RPN的内容:

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

那么算法是这样的: 假设RPN版本中的每个符号都是符号数组中的一个元素。 从数组中获取元素,如果这是一个数字,则将其放在堆栈上,如果这是运算符,则从堆栈中获取两个元素并执行操作。结果应再次落在堆栈上。重复此操作,直到到达数组的最后一个元素。最后,堆栈上只有一个元素是您的答案

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

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

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

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

是否有括号?您可能会在+1处发现一些有趣的信息,然后从叶子开始自下而上计算,直到到达根节点。我不确定这是什么。我刚开始编程。已经有几个月没做了。