带括号的java表达式求值中缀和使用递归的DMAS规则

带括号的java表达式求值中缀和使用递归的DMAS规则,java,recursion,Java,Recursion,这是我在堆栈溢出上找到的代码,但它不能处理需要帮助的错误 public static int evaluateE(String s) { //Base case if (!s.contains("+") && !s.contains("-") && !s.contains("*") && !s.contains("/")) { return Integer.parseInt(s); } 这里它首先检查优先级+,-

这是我在堆栈溢出上找到的代码,但它不能处理需要帮助的错误

public static int evaluateE(String s) {
//Base case

    if (!s.contains("+") && !s.contains("-") && !s.contains("*") && !s.contains("/")) {
        return Integer.parseInt(s);
    }
这里它首先检查优先级+,-然后*,/但不检查括号和括号

    int i;
// search for '+' and '-' first

    for (i = s.length() - 1; i >= 0; i--) {
        if (s.charAt(i) == '+' || s.charAt(i) == '-') {
            break;
        }
    }
    if (i < 0) {
// if '+' and '-' were not found, search for '*' and '/'

        for (i = s.length() - 1; i >= 0; i--) {
            if (s.charAt(i) == '*' || s.charAt(i) == '/') {
                break;
            }
        }
    }

    String r1 = s.substring(0, i);
    String r2 = s.substring(i + 1, s.length());

    int result = 0;

    switch (s.charAt(i)) {
        case '+':
            result = evaluateE(r1) + evaluateE(r2);
            break;
        case '-':
            result = evaluateE(r1) - evaluateE(r2);
            break;
        case '*':
            result = evaluateE(r1) * evaluateE(r2);
            break;
        case '/':
            int right = evaluateE(r2);
            if (right == 0) //if denominator is zero
            {
                System.out.println("Invalid divisor");
                System.exit(1);
            } else {
                result = evaluateE(r1) / right;
            }
            break;
    }
    return result;

}
inti;
//首先搜索“+”和“-”
对于(i=s.length()-1;i>=0;i--){
如果(s.charAt(i)='+'| | s.charAt(i)='-'){
打破
}
}
if(i<0){
//如果未找到“+”和“-”,请搜索“*”和“/”
对于(i=s.length()-1;i>=0;i--){
如果(s.charAt(i)='*'| | s.charAt(i)=='/')){
打破
}
}
}
字符串r1=s.子字符串(0,i);
字符串r2=s.substring(i+1,s.length());
int结果=0;
开关(s.charAt(i)){
格“+”:
结果=被评估者(r1)+被评估者(r2);
打破
案例'-':
结果=被评估者(r1)-被评估者(r2);
打破
案例“*”:
结果=被评估者(r1)*被评估者(r2);
打破
案例“/”:
int right=evaluateE(r2);
if(right==0)//如果分母为零
{
System.out.println(“无效除数”);
系统出口(1);
}否则{
结果=被评估者(r1)/右侧;
}
打破
}
返回结果;
}
也许这样行

public static int evaluateE(字符串s){
//基本情况
如果(!s.contains(“+”&&!s.contains(“-”&&!s.contains(“*”&&!s.contains(“/”))){
返回整数.parseInt;
}
//当遇到括号时在字符串上迭代求值表达式
对于(int j=0;j=0;i--){
如果(s.charAt(i)='+'| | s.charAt(i)='-'){
打破
}
}
if(i<0){
//如果未找到“+”和“-”,请搜索“*”和“/”
对于(i=s.length()-1;i>=0;i--){
如果(s.charAt(i)='*'| | s.charAt(i)=='/')){
打破
}
}
}
字符串r1=s.子字符串(0,i);
字符串r2=s.substring(i+1,s.length());
int结果=0;
开关(s.charAt(i)){
格“+”:
结果=被评估者(r1)+被评估者(r2);
打破
案例'-':
结果=被评估者(r1)-被评估者(r2);
打破
案例“*”:
结果=被评估者(r1)*被评估者(r2);
打破
案例“/”:
int right=evaluateE(r2);
如果(右==0){
System.out.println(“无效除数”);
系统出口(1);
}
else结果=被评估者(r1)/右侧;
打破
}
返回结果;
}
公共静态void main(字符串[]args){
系统输出打印LN(被评估者(“4*(3*(6+6)+7”);
}
主要用于输入
“4*(3*(6+6)+7)”

输出:

172

// iterate over string when encounter parentheses evaluate expression inside
 for(int j = 0; j < s.length(); j++){
    if (s.charAt(j) == ')'){
        int k = j;

        System.out.println("k : "+k+"\n J : "+j);
        // go back to left parentheses
        while (s.charAt(k) != '(')
            k--;

        System.out.println("k : "+k+"\n J : "+j);

        String left = s.substring(0,k);
        String inparen = Integer.toString(evaluateE(s.substring(k+1,j)));
        String right = s.substring(j+1,s.length());


        s = left + inparen + right;
        j = left.length() + inparen.length()-1;
    }
    else if (s.charAt(j) == ']'){
        int k = j;

        System.out.println("k : "+k+"\n J : "+j);
        // go back to left parentheses
        while (s.charAt(k) != '[')
            k--;

        System.out.println("k : "+k+"\n J : "+j);

        String left = s.substring(0,k);
        String inparen = Integer.toString(evaluateE(s.substring(k+1,j)));
        String right = s.substring(j+1,s.length());


        s = left + inparen + right;
        j = left.length() + inparen.length()-1;
    }

}