How to calculate expression in java?

前端 未结 4 1382
时光取名叫无心
时光取名叫无心 2020-12-11 11:37

How to calculate user given Expression in java.

E:g, if the given exp is 3*4+(5*6) how to calculate this. can anyone help me out.

4条回答
  •  无人及你
    2020-12-11 12:33

    I found this code after a quick google:

    import java.util.Stack;
    
    /**
     * Class to evaluate infix and postfix expressions.
     * 
     * @author Paul E. Davis (feedback@willcode4beer.com)
     */
    public class InfixPostfixEvaluator {
    
            /**
             * Operators in reverse order of precedence.
             */
            private static final String operators = "-+/*";
            private static final String operands = "0123456789";
    
            public int evalInfix(String infix) {
                    return evaluatePostfix(convert2Postfix(infix));
            }
    
            public String convert2Postfix(String infixExpr) {
                    char[] chars = infixExpr.toCharArray();
                    Stack stack = new Stack();
                    StringBuilder out = new StringBuilder(infixExpr.length());
    
                    for (char c : chars) {
                            if (isOperator(c)) {
                                    while (!stack.isEmpty() && stack.peek() != '(') {
                                            if (operatorGreaterOrEqual(stack.peek(), c)) {
                                                    out.append(stack.pop());
                                            } else {
                                                    break;
                                            }
                                    }
                                    stack.push(c);
                            } else if (c == '(') {
                                    stack.push(c);
                            } else if (c == ')') {
                                    while (!stack.isEmpty() && stack.peek() != '(') {
                                            out.append(stack.pop());
                                    }
                                    if (!stack.isEmpty()) {
                                            stack.pop();
                                    }
                            } else if (isOperand(c)) {
                                    out.append(c);
                            }
                    }
                    while (!stack.empty()) {
                            out.append(stack.pop());
                    }
                    return out.toString();
            }
    
            public int evaluatePostfix(String postfixExpr) {
                    char[] chars = postfixExpr.toCharArray();
                    Stack stack = new Stack();
                    for (char c : chars) {
                            if (isOperand(c)) {
                                    stack.push(c - '0'); // convert char to int val
                            } else if (isOperator(c)) {
                                    int op1 = stack.pop();
                                    int op2 = stack.pop();
                                    int result;
                                    switch (c) {
                                    case '*':
                                            result = op1 * op2;
                                            stack.push(result);
                                            break;
                                    case '/':
                                            result = op2 / op1;
                                            stack.push(result);
                                            break;
                                    case '+':
                                            result = op1 + op2;
                                            stack.push(result);
                                            break;
                                    case '-':
                                            result = op2 - op1;
                                            stack.push(result);
                                            break;
                                    }
                            }
                    }
                    return stack.pop();
            }
            private int getPrecedence(char operator) {
                    int ret = 0;
                    if (operator == '-' || operator == '+') {
                            ret = 1;
                    } else if (operator == '*' || operator == '/') {
                            ret = 2;
                    }
                    return ret;
            }
            private boolean operatorGreaterOrEqual(char op1, char op2) {
                    return getPrecedence(op1) >= getPrecedence(op2);
            }
    
            private boolean isOperator(char val) {
                    return operators.indexOf(val) >= 0;
            }
    
            private boolean isOperand(char val) {
                    return operands.indexOf(val) >= 0;
            }
    
    }
    

    From: http://willcode4beer.com/design.jsp?set=evalInfix

提交回复
热议问题