如何在java中计算用户给定的表达式。
E:g,如果给定的exp为3 * 4 +(5 * 6) 怎么计算这个。任何人都可以帮助我。
答案 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;
}
}
答案 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中的数学表达式解析)。