如何在java中计算表达式?

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

E:g,如果给定的exp为3 * 4 +(5 * 6),如何计算。 谁能帮我吗。

我在快速谷歌后发现了这段代码:

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

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

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

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或其他解析器生成器,您可以使用您接受的字符串更灵活,允许换行和其他空格。

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