1

我正在尝试编写一个程序来评估用户输入的表达式。我知道我需要有单独的方法,所以它首先评估乘法和除法,然后再添加加法和减法。这是我到目前为止得到的。当我尝试任何涉及乘法或除法的事情时,比如 6*6,它只会打印第一个字符,在这种情况下它只是“6”。有任何想法吗?

import java.util.Scanner;
class Expressions {
String e;

void setExpressions(String exp) {
    e = exp;
}
String evaluate() {
    String n = "";
    for (int i = 0; i < e.length(); i++)
        if (e.charAt(i) == '*' || e.charAt(i) == '/') {  
            n += e.charAt(i);
        }
        else if (e.charAt(i) == '+' || e.charAt(i) == '/') {
            evaluateMD();
            n = "";
        }
        else 
            n += e.charAt(i);
    return n;
}
int evaluateMD () {
    int r = 1;
    int n = 0;
    char op = '*';

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

    return r;

}
int evaluateAS() {
    //e has +, - only, multiple digit numbers 
    int r = 0;
    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 if (e.charAt(i) == '*' || e.charAt(i) == '/')
            n = 0;
        else //digits
            n = n*10 + (e.charAt(i)-'0');
    if (op == '+') //last operation
        r += n;
    else 
        r -= n;

    return r;
}
}
 public class hw10 {
 public static void main(String[] args) {
    Scanner in = new Scanner (System.in);
    Expressions myE = new Expressions();

    System.out.print("Enter E:");//E for expression
    String e = in.next();

    myE.setExpressions(e);
    //int r = myE.evaluate1();

    int r = myE.evaluateAS();

    System.out.println(e+" = "+r);



}
}
4

2 回答 2

1

如果我需要编写算术表达式解析器,我会使用非常简单的方法:从用户那里获取输入,将其转换为反向波兰符号(查看名为Shunting-yard algorithm的部分),然后对其进行评估。
Robert Lafore 在他的“Java 中的数据结构和算法”中对这两种算法进行了非常简单的解释——从中缀到 RPN 的转换以及用 RPN 编写的表达式的评估,以及源代码,因此您可以看到它是如何实现的。阅读后,很容易将两种算法合二为一——看看关于这个主题的一个问题。

于 2013-11-09T08:05:14.583 回答
1

换行

if (op == '+') //last operation  

在评估MD方法中

if (op == '*') //last operation  

,将方法的返回类型更改为加倍并使 r 和 n 加倍为评估MD 产生更好的结果,但实际上你的整个过程需要大修,如果不是完全放弃的话。

我认为如果您的评估方法只返回计算的答案会更好。

它最多只需要存储 2 个值:(如果您有一个 AS 操作,如果下一个运算符是 MD,您将存储它,因为需要首先评估 MD,但是一旦 MD 操作(这可能涉及更多计算出一个运算符或同一个运算符的多个实例(即 4*5*6 或 4/3*2),然后您可以立即执行“等待”AS。对于 MD 操作,您只需存储最新更新每次,因为您几乎已经使用了 evaluateMD 方法(我认为该方法适用于我放在顶部的修改。如果我确实做了一些其他更改,所以不方便询问我)。

这是对您尝试的方法的改进,但正如我所说,在其他答案中可能会更好地提及一些方法。

于 2013-11-09T04:39:03.997 回答