简体   繁体   中英

java expression evaluation INFIX with brackets and DMAS rule using recursion

here is the code i hve found on stack overflow but it does'nt handle brckets need help

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

    if (!s.contains("+") && !s.contains("-") && !s.contains("*") && !s.contains("/")) {
        return Integer.parseInt(s);
    }

here it is checking precedence first + ,- then *, / but it doesn't check for brackets and parentheses

    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;

}

Maybe this works...

public static int evaluateE(String s) {
    //Base case
    if (!s.contains("+") && !s.contains("-") && !s.contains("*") && !s.contains("/")) {
        return Integer.parseInt(s);
    }


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


            // go back to left parentheses
            while (s.charAt(k) != '(')
                k--;

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

    }


    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) {
                System.out.println("Invalid divisor");
                System.exit(1);
            }
            else result = evaluateE(r1) / right;
            break;
    }
    return result;
}

public static void main(String[] args) {
    System.out.println(evaluateE("4*(3*(6+6)+7)"));

}

in main for input of "4*(3*(6+6)+7)"

output:

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

i change the code little bit to increment the [ ] solving feature

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

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM