6

関数を実装する必要があり、public int eval(String infix) {...} これを次のように使用する場合:

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

21を受け取る必要があります。

算術式には、「+」、「*」、および括弧を含めることができます。

では、これを数式に変換するにはどうすればよいでしょうか。非標準のライブラリは使用できません。

更新: 解決策が見つかりました。

ポーランド記法と ScriptEngine の 2 つの方法があります。


4

3 に答える 3

12

信じられないかもしれませんが、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));
于 2012-12-01T18:11:26.483 に答える
3

まず、文字列をトークン化する必要があります。基本的に、各要素を分離します。操作を個々の番号から分離し、何か (おそらくリスト) に格納します。次に、操作の順序に基づいて操作を実行します。

したがって、擬似コードは次のようになります。

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
}

これを行うにはもっと良い方法があるかもしれませんが、ここでは 1 つの解決策を示します。

于 2012-12-01T17:56:07.010 に答える
1
  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);

    }
于 2012-12-01T18:31:58.140 に答える