如何在java中计算表达式?

时间:2011-08-25 05:34:30

标签: java infix-notation

如何在java中计算用户给定的表达式。

E:g,如果给定的exp为3 * 4 +(5 * 6) 怎么计算这个。任何人都可以帮助我。

4 个答案:

答案 0 :(得分:4)

我在快速谷歌后找到了这段代码:

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

}

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

答案 1 :(得分:2)

查看Java Expression评估器:http://java.net/projects/eval/pages/Home

答案 2 :(得分:2)

Java已经这样做了。无需下载任何内容。

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

(这不是第一个展示如何在Java中使用脚本的答案。我只是在这里添加它,以防查看此页面的人不遵循链接。解析很有趣,也很有价值,但是如果你只需要评估用户提供的表达式,使用脚本。)

更新 OP正在寻找后缀评估解决方案。这必须分两步完成:首先将输入字符串转换为后缀表示法,然后通过(可能是基于堆栈的评估程序)运行后缀“代码”。请参阅PaulPRO对此的回答。如果您愿意使用JavaCC或其他解析器生成器,您可以使用您接受的字符串更灵活,允许换行和其他空格。

答案 3 :(得分:0)

这是一个spoiler(Java中的数学表达式解析)。