如何向表达式求解器添加操作顺序?

时间:2013-11-08 03:22:36

标签: java expression operator-precedence

好吧,所以我正在尝试创建一个表达式为字符串的解算器,以便用户可以输入一个字符串,例如2 + 4 * 5/10,它将打印出答案,4我写了一些代码,但它不适用于操作顺序;它只是按操作符的顺序求解方程式 - 例如2 + 4 * 5/10会产生3,这是不正确的。我如何使它首先执行乘法和除法,然后加法和减法? 这是我现在的代码:

class Expressions
{
String E;
void SetE(String e)
{
    E = e;
}

int EvalE()
{
    int res = 0;
    int temp = 0;
    char op = '+';

    for(int i=0;i<E.length();i++)
    {
        if(E.charAt(i)=='*'||E.charAt(i)=='/'||E.charAt(i)=='+'||E.charAt(i)=='-')
        {
            if(op=='*')res*=temp;
            else if(op=='/')res/=temp;
            else if(op=='+')res+=temp;
            else res-=temp;

            temp=0;
            op=E.charAt(i);
        }
        else
        {
            temp = temp*10+E.charAt(i)-'0';
        }
    }

    if(op=='*')res*=temp;
    else if(op=='/')res/=temp;
    else if(op=='+')res+=temp;
    else res-=temp;

    return res;
}
}

3 个答案:

答案 0 :(得分:1)

使用两个for循环。

在第一个循环中,搜索*/运算符。评估该部分并将该部分字符串替换为评估结果。

在您的第二个循环中,执行您已经完成的所有+-

因此,对于您使用的示例2+4*5/10,您的第一个循环会查找*/。找到*后,它会评估4*5。这是20,因此字符串被修改为2+20/10。再次检查,它会找到/,并将字符串修改为2+2

现在,您将完成第二个循环,并获得4

答案 1 :(得分:1)

您需要执行两个步骤而不是一个步骤。在第一步中,您将方程解析为reverse polish notation,然后在第二步中运行并计算结果。好的奖金是你得到(几乎)免费的括号支持: - )

答案 2 :(得分:1)

将表达式拆分为两个更简单的表达式,然后使用递归。

您必须按照此顺序执行以下步骤,否则您将搞乱操作顺序。

  1. 寻找最右边的+标志。如果有这样的+,则使用递归来计算它左边的子表达式,然后是它右边的子表达式,然后添加它们并返回结果。
  2. 如果没有+符号,那么寻找最右边的符号 - 前面有一个数字(也就是说,它是减法,而不是否定)。如果有这样的 - ,则使用递归来计算它左边的子表达式,然后是它右边的子表达式,然后减去它们并返回结果。
  3. 如果没有+或 - 符号,则查找最右边的*符号。如果有这样的*,那么使用递归来计算它左边的子表达式,然后是它右边的子表达式,然后将它们相乘并返回结果。
  4. 如果没有+, - 或*符号,则查找最右边的*符号。如果有这样的*,那么使用递归来计算它左边的子表达式,然后是它右边的子表达式,然后除它们并返回结果。如果您使用整数,则必须考虑是否需要整数除法或浮点数。你可能还想做一些除以零之外的检查。
  5. 如果没有+, - ,*或/,那么你所拥有的只是数字和空格。也许是一个负号。删除空格,解析并返回。
  6. 示例:“6 - 5 - 4 + 3 * -2”

    • 首先,在+处拆分,并使用递归来评估“6 - 5 - 4”和 “3 * -2”。
    • 对于“6 - 5 - 4”,在第二个分裂 - ,并使用 递归评估“6 - 5”和“4”。
    • 对于“6 - 5”,拆分为 - ,并使用递归来评估“6”和“5”。
    • 对于“3 * -2”,在*处拆分,因为 - 前面没有数字。使用递归来评估“3”和“-2”。
    • 对于“6”,“5”,“4”,“3”和“-2”中的每一个,都没有运算符,所以我们只删除空格并进行解析。
    • 我们计算的结果将是“((6-5)-4)+(3 * -2)”,因此操作顺序正确。