2014-02-05 70 views
0
string input = "12+5-1"; 

預計產出將是:16我想我的字符串中執行多個數學運算

的算法應該識別符(+, - ,*,/),然後通過與一個做操作的一個給定的數字作爲輸入。

我最初創建一個字符串數組

string[] strArrInput = input; 

有人建議我不過說我是低效的,那是因爲一個字符串已經是一個字符數組。我需要這個邏輯的幫助。

編輯:

順便說一句,我試圖做一個科學計算器,可以做PEMDAS

+1

問正確的問題,並告訴我們,你到目前爲止做了什麼! – bobbel

+0

效率真的是這裏的問題嗎?如果不是,你應該專注於最優雅的解決方案。 – Magnilex

+1

你可以將這個'String'解析爲一個JavaScript腳本(雙關),並使用像犀牛或'ScriptEngine'這樣的JavaScript引擎來執行它。相關:http://stackoverflow.com/q/7487908/1065197 –

回答

0

您可以使用內置的JavaScript引擎對於這個..

import javax.script.ScriptEngine; 
    import javax.script.ScriptEngineManager; 
    import javax.script.ScriptException; 

    public class Test { 
     public static void main(String[] args) throws ScriptException { 
      ScriptEngineManager mgr = new ScriptEngineManager(); 
      ScriptEngine scriptEngine = mgr.getEngineByName("JavaScript"); 
      String expression = "12+5-1"; 
      System.out.println(scriptEngine.eval(expression)); 

     } 
    } 
+0

無法解析符號ScriptEngine –

0

我一直在使用堆棧做了一個簡單的代碼,看看這個。

import java.util.Scanner; 
import java.util.Stack; 

public class Evaluate { 

public static void main(String[] args) { 
    Scanner sc=new Scanner(System.in); 
    String input=sc.next(); 
    Stack<Character> operator; 
    Stack<Integer> operands; 
    operands=new Stack<Integer>(); 
    operator=new Stack<Character>(); 
    int res=0,c; 
    for(int i=0 ; i<input.length() ;i++){ 
     c =input.charAt(i); 
     if(!isOperator(c)){ 
      res *= 10; 
      res += c - '0'; 
     }else{ 
      operator.push((char)c); 
      operands.push(res); 
      res=0; 
      } 
    } 
    operands.push(res); 
    int a,b; 
    char op; 
    for(; operands.size()>1 ;){ 
     a=operands.pop(); 
     b=operands.pop(); 
     op=operator.pop(); 
     operands.push(result(a,b,op)); 
    } 

    System.out.println(operands); 

} 
public static boolean isOperator(int c) { 
    return c == '+' || c == '-' || c == '*' || c == '\\'; 
} 
public static int result(int a,int b,char c){ 
    if(c=='+') 
     return a+b; 
    if(c=='-') 
     return b-a; 
    if(c=='*') 
     return a*b; 
    else 
     return b/a; 
} 

} 

你可以使用這樣的東西,我沒有實現操作數優先級,但我認爲你現在可以做到這一點。

0

您可以使用givn字符串函數解析字符串。 (indexOf,lastOf,split)但寫一個知道數學的algho並不那麼容易。 我已經做了一次(沒有「()」),但有代碼給你。 8 我告訴你,我做了什麼:

我搜索的第一個爲 '*,/' 如

input=120-20*2+30; 

左側的givn指數

left=120-20; 
right=2+30; 

在分割字符串分割我搜索最後的+, - 在右邊第一個 再次將其分割爲givn索引 (leftRest = 120; rightRest = + 30)

現在我走左邊發現價值-20它解析爲BigDecimal(因爲這將要給你的逗號值更好的結果),並解析正確的價值發現爲BigDecimal 2 現在ü可以計算

calcValue=-40=-20 * 2; 

寫入值回到字符串,如果calcValue不是負號,你必須在之前寫一個+; somting這樣就可以了:

if(calcValue>0){ 
setPlus="+"; 
}else{ 
setPlus=""; 
} 

input=leftRest+setPlus+Value+rightRest; 

,讓U:

120-40+30 

現在ürepead直到有沒有*,/ 則u開始搜索+, -

如果妳分割財產以後與bigDecimal你不得不說,你喜歡有多少逗號值...否則它會拋出一個豁免認爲像三分之一

如果你想用'()'做到這一點你必須首先在'(',')'拆分字符串,然後寫入數學,然後寫回無「()」

希望我能幫助你一點,我認爲有其他的方法來做到這一點,但我只需要6小時,完全醉DO編寫代碼^^

斯特凡

相關問題