2013-02-26 18 views
7

は、私はこのように宣言しています方法を考えてみましょう。文字列を数式に変換しますか?</p> <pre><code>public double Calc(String expression) { // Code } </code></pre> <p>私はその後<code>Calc()</code>にそれを送り、それはそれを取得値を返す必要があり</p> <pre><code>"2 + 4 - (3 * 4)" </code></pre> <p>のような文字列式をしたい:

数式を解析して、Javaが理解できる式になるようにすることはできますか?通常は書くことができるので

return 2 + 4 - (3 * 4); 

しかし、それはその1つの表現でのみ機能します。

+0

これを見てください:あなたは、通常、式ツリーはhttpを使用したい独自のロールするには http://stackoverflow.com/questions/2605032/using-eval-in-java –

+1

を://en.wikipediaを.org/wiki/Binary_expression_tree –

+0

@betoしかしこれは、JSエンジン全体を開いてこの1つのことを行うように思えます。それは私に思い起こさせるヒントを与えましたが。ありがとう! – OmniOwl

答えて

6

私はDijkstraのtwostackアルゴリズムを使用することをお勧めします。

public class DijkstraTwoStack { 
    public static void main(String[] args) { 
       Scanner scanner = new Scanner(System.in); 
       String exp[] = scanner.nextLine().split(" "); 
     Stack<String> ops = new Stack<String>(); 
     Stack<Double> vals = new Stack<Double>(); 

     for(int i = 0; i < exp.length; i++) { 
         String s = exp[i]; 
      if (s.equals("(")) { 
      } 
      else if (s.equals("+") || s.equals("*")) { 
       ops.push(s); 
      } else if (s.equals(")")) { 
       getComp(ops, vals); 
      } else { 
       vals.push(Double.parseDouble(s)); 
      } 
     } 
     getComp(ops, vals); 
     System.out.println(vals.pop()); 
    } 

    private static void getComp(Stack<String> ops, Stack<Double> vals) { 
     String op = ops.pop(); 
     if (op.equals("+")) { 
      vals.push(vals.pop() + vals.pop()); 
     } else if (op.equals("*")) { 
      vals.push(vals.pop() * vals.pop()); 
     } 
    } 
} 

がそれをテストしていませんが、それは右であるべきである:

これはかなりあなたが必要なものでなければなりません。

+0

効率的ではありませんが、これを使うことができます.... 'ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngineエンジン= manager.getEngineByName( "js"); オブジェクトの結果= engine.eval( "3 + 4"); *クレジット:http://stackoverflow.com/a/2605051/936786 –

+0

既存の回答からコードを変更しないでください。イテレータは必要ありませんでした。アルゴリズムを壊すでしょう。 –

0

私は、JSコンパイラをロードせずにこれを行う方法について公正なアイデアを得なければならないので、いくつかの質問をブラウズしていますが、私が思うように採用することができるプロセスを回答として述べてください。

まず、数学文字列を中文字列に変換する関数を使用して文字列を解析する必要があります。次に、ループ内の文字列を分解して答えを返すことによって、この式を別の関数として評価します。美しく詳細なプロセスはfound hereです。

関連する問題

 関連する問題