如何解决用户输入中不使用括号的表达式?

时间:2013-11-09 02:01:12

标签: java if-statement for-loop expression

我正在尝试编写一个程序来评估用户输入的表达式。我知道我需要有单独的方法,所以它先评估乘法和除法,然后再加上加法和减法。这是我到目前为止所得到的。当我尝试涉及乘法或除法的任何事情时,例如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);



}
}

2 个答案:

答案 0 :(得分:1)

更改行

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

在evaluateMD方法中

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

,将方法的返回类型更改为double并使r和n加倍会为evaluateMD生成更好的结果,但实际上,如果不是完全放弃,则整个过程需要进行大修。

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

它最多只需要存储2个值:(如果您有AS操作,如果下一个操作符是MD,则存储它,因为MD需要首先进行评估,但是一旦MD操作(可能涉及多个操作员或同一操作员的多个实例,即4 * 5 * 6或4/3 * 2),然后您可以立即执行“等待”AS。对于MD操作,您只需存储每次都是最新的更新,因为你几乎已经在你的evaluateMD方法中工作了(我认为这与我放在顶部的修改有关。如果它没有随意问我,因为我做了一些其他更改) 。

这是对您尝试的方法的改进,但正如我所说,可能有更好的方法在其他答案中仍然提到。

答案 1 :(得分:1)

如果我需要编写算术表达式解析器,我会使用非常简单的方法:从用户获取输入,将其转换为reverse polish notation(看看名为 Shunting-yard算法),并评估它 Robert Lafore在他的&#34; Java中的数据结构和算法&#34;对两种算法都有相当简单的解释 - 从中​​缀到RPN的转换以及使用源代码评估用RPN编写的表达式,因此您可以看到它是如何实现的。阅读之后,将两种算法合二为一很容易 - 请看一下one of my questions这个主题。