2

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.

Angel O'Sphere
  • 2,642
  • 20
  • 18
Jey
  • 383
  • 2
  • 4
  • 6
  • 1
    Duplicate: http://stackoverflow.com/questions/3422673/java-evaluate-string-to-math-expression – Ray Toal Aug 25 '11 at 05:38
  • Does it have to be a postfix evaluation? You tagged it postfix but you did not make that clear in the question. If it doesn't, just go to the linked page and copy the selected answer; it is just a couple lines of code. – Ray Toal Aug 25 '11 at 05:42
  • 1
    Yes it have to be postfix evaluation. sorry i didnt mention it. – Jey Aug 25 '11 at 05:56

4 Answers4

4

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<Character> stack = new Stack<Character>();
                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<Integer> stack = new Stack<Integer>();
                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

Giancarlo Romeo
  • 663
  • 1
  • 9
  • 24
Paul
  • 139,544
  • 27
  • 275
  • 264
2

Take a look at Java Expression evaluator: http://java.net/projects/eval/pages/Home

legendofawesomeness
  • 2,901
  • 2
  • 19
  • 32
2

Java does this already. No need to download anything.

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class EvaluationExample {
    public static void main(String[] args) throws Exception{
        System.out.println(new ScriptEngineManager().getEngineByName("JavaScript").eval("3*4+(5*6)"));
    } 
}

(This is not the first SO answer to show how to use scripting in Java. I only added it here in case people looking at this page do not follow the links. Parsing is fun, and valuable to study, but if you just need to evaluate user-supplied expressions, use a script.)

UPDATE The OP is looking for a postfix evaluation solution. This has to be done in two steps: first convert the input string into postfix notation, then run the postfix "code" through a (presumably stack-based evaluator). See PaulPRO's answer for this. If you are willing to use JavaCC or another parser generator, you can be much more flexible with the strings you accept, allowing newlines and other whitespace.

Ray Toal
  • 86,166
  • 18
  • 182
  • 232
0

Here's a spoiler (Mathematical Expression Parse in Java).

Andreas Dolk
  • 113,398
  • 19
  • 180
  • 268