如何在java中計算用戶給出的表達式。 E:g,如果給定的exp是3 * 4 +(5 * 6) 如何計算這個。誰能幫我嗎。如何在java中計算表達式?
1
A
回答
4
我發現這個代碼快速谷歌後:
import java.util.Stack;
/**
* Class to evaluate infix and postfix expressions.
*
* @author Paul E. Davis ([email protected])
*/
public class InfixPostfixEvaluator {
/**
* Operators in reverse order of precedence.
*/
private static final String operators = "-+/*";
private static final String operands = "";
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;
}
}
0
這裏有一個spoiler(在Java中數學表達式解析)。
2
看看Java表達式求值:http://java.net/projects/eval/pages/Home
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)"));
}
}
(這是不是第一次SO答案來說明如何在Java中使用腳本。我只是在情況下這裏的人加入尋找它在本頁面不遵循鏈接。解析是樂趣,並研究有價值,但如果您只是需要評估用戶提供的表達式,請使用腳本。)
UPDATE OP正在尋找postfix評估解決方案。這必須分兩步完成:首先將輸入字符串轉換爲後綴表示法,然後通過(可能基於堆棧的評估程序)運行後綴「代碼」。請參閱PaulPRO的答案。如果您願意使用JavaCC或其他解析器生成器,則可以更靈活地使用您接受的字符串,從而允許換行符和其他空格。
相關問題
- 1. 如何計算表達式
- 2. 如何計算表達式
- 3. 如何在Java中計算整數表達式
- 4. 如何計算算術表達式
- 5. Java - 計算大型數學表達式
- 6. 如何計算以下表達式
- 7. 需要在表達式中的Java計算器
- 8. 在java中計算一個簡單的表達式
- 9. 正則表達式計算
- 10. 矩陣表達式計算
- 11. MDX表達式:計算員
- 12. 計算波蘭表達式
- 13. 計算列表達式
- 14. 用lambda表達式計算
- 15. C++計算表達式
- 16. 如何在異步計算表達式中編寫Task.ContinueWith
- 17. 如何計算在Java中
- 18. 式計算在Java中
- 19. 如何計算Java正則表達式中的字符串中的括號數
- 20. 如何在正則表達式中使用Java lambda表達式
- 21. Java表達式解析器和計算器調車場算法
- 22. 正則表達式中的計算
- 23. 計算器中的正則表達式
- 24. 角度表達式中的計算
- 25. 計算成員表達式中的SQL
- 26. 在AngularJS表達式計算功能
- 27. 表達式的SSRS/RDLC計算小計
- 28. 如何計算在根在下面的表達式
- 29. 包含在Java函數計算表達式
- 30. 如何計算算術表達式(String)並返回答案?
重複:http://stackoverflow.com/questions/3422673/java-evaluate-string-to-math-expression –
它是否必須是後綴評估?你把它標記爲postfix,但你沒有在問題中說清楚。如果沒有,只需進入鏈接頁面並複製所選答案;它只是幾行代碼。 –
是的,它必須是後綴評估。對不起,我沒有提到它。 – Jey