2012-12-01 83 views
4

我需要實現的功能public int eval(String infix) {...} ,當我用這個像這樣:Java字符串以數學方程式

eval("3+2*(4+5)") 

我必須接受21

算術表達式可以包含「+」,「* '和括號。

那麼,我該如何將其轉換爲數學方程? 我不能使用非標準的庫。

更新: 找到解決方案。

它是2種方式:波蘭語法和使用ScriptEngine。


+5

那你試試這麼遠嗎? – Maroun

+0

提示:[BODMAS](http://en.wikipedia.org/wiki/Order_of_operations),[stack](http://docs.oracle.com/javase/6/docs/api/java/util/Stack。 HTML)。 – Prasanth

+0

我把'String'發送給'eval'。 – JohnDow

回答

10

信不信由你,用JDK1.6,你可以使用內置的JavaScript引擎。定製以滿足您的需求。

請確保您有這些進口...

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

代碼:

ScriptEngineManager mgr = new ScriptEngineManager(); 
ScriptEngine engine = mgr.getEngineByName("JavaScript"); 
String infix = "3+2*(4+5)"; 
System.out.println(engine.eval(infix)); 
+0

JavaScript以外的各種引擎名稱是否可用? – vikiiii

+0

@vikiiii Just Javascript - http://www.java2s.com/Code/JavaAPI/javax.script/ScriptEngineFactorygetEngineName.htm - 輸出 - Mozilla Rhino,1.7發佈3 PRERELEASE,ECMAScript,1.8,[js],[application/javascript ,application/ecmascript,text/javascript,text/ecmascript],[js,rhino,JavaScript,javascript,ECMAScript,ecmascript] – xagyg

2

那麼首先,你想要標記字符串。基本上,分離每個元素。將操作與個別號碼分開,並將它們存儲在某些內容中(可能是一個列表)。然後按照操作順序進行操作。

所以僞代碼會是這樣的:

public int eval(String infix) 
{ 
    create a list of all the elements 
    identify which operations you would want to do first 
    perform the operations and simplify the list (e.g. if 5x4 were inside parantheses, remove the parantheses and replace it overall with 20.) 
    continue the simplification until you have a final result 
    return the result 
} 

可能有更好的方法來做到這一點,但這裏有一個解決方案。

0
static int eval(String infix) {   
     ScriptEngineManager mgr = new ScriptEngineManager(); 
     ScriptEngine engine = mgr.getEngineByName("JavaScript");  
     String stringResult; 
     try { 
      stringResult = engine.eval(infix).toString(); 
      double doubleResult = Double.parseDouble(stringResult); 
      int result = (int) doubleResult;   
      return result; 
     } catch (ScriptException ex) { 
      Logger.getLogger(Ukol4a.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return(1); 

    } 
相關問題