2011-08-25 62 views
1

如何在java中計算用戶給出的表達式。 E:g,如果給定的exp是3 * 4 +(5 * 6) 如何計算這個。誰能幫我嗎。如何在java中計算表達式?

+1

重複:http://stackoverflow.com/questions/3422673/java-evaluate-string-to-math-expression –

+0

它是否必須是後綴評估?你把它標記爲postfix,但你沒有在問題中說清楚。如果沒有,只需進入鏈接頁面並複製所選答案;它只是幾行代碼。 –

+1

是的,它必須是後綴評估。對不起,我沒有提到它。 – Jey

回答

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

} 

來源:http://willcode4beer.com/design.jsp?set=evalInfix

0

這裏有一個spoiler(在Java中數學表達式解析)。

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或其他解析器生成器,則可以更靈活地使用您接受的字符串,從而允許換行符和其他空格。