2013-01-01 18 views
5

私は非常にJavaに新しいので、私は電卓を構築している、それは方程式を取り、それを評価する。ブラケットの優先順位を与える

私はスキャナメソッドを使用して入力を取得していますが、これは入力がスキャナタイプであることを意味します。私はそれを評価するためにこの入力に対して何をすべきですか?それを評価できたら、どうやって括弧を優先することができますか?例えば、方程式(5 *(4 + 3))* 2の場合、プログラムは(4 + 3)を評価してから4を掛けた後、 2.

ありがとうございます。

+0

文字列として式(等号が含まれていないため、等式ではない)を読み取って解析する必要があります。 'スキャナ(Scanner) 'を使用しても、テキスト行を読むこと以外は、このプロセスでは非常に遠くにはなりません。 –

+0

あなたがしたことは正しいです、優先順位は左から右に与えられます。または((4 + 3)* 5)* 2を使用できます。まず内側の括弧が評価されます。 –

+1

ブラケットを含む演算子をスタックに配置します。 – user1929959

答えて

1

これは参考になると思います:Polish notationReverse Polish notationです。ツリー内で文字列を分割し、一度に1つのステップを実行する方法のアイデアを説明します。

3

必要なものはDijkstra's Shunting Yard Algorithmです。これは、修正済みの数式表記を修正後の表記法に変換します。これは、修正後の表記法でどちらの表記も必要ないため、演算子の優先順位と括弧のすべての問題をきれいに並べ替えます。 WikipediaのページにはC言語の完全な例があり、Javaに変換することができます。

1

@Simon Gの提案は、Dijkstra's Shunting Yardアルゴリズムを使用することを提案しています。シンボルを解析するための「マイクロ文法」を実装する必要がありますが、Scannerは作業の95%を実行できます。

代わりに、ANTLRやJavaccなどのパーサジェネレータを使用して表現パーサを実装し、評価をツリーのトラバーサルとして実装することもできます。しかし、単に式を一度評価したいのであれば、それはかなり重いです。

最後に、これはよく知られている(解決された)問題ですが、どの言語でも簡単な問題ではありません。そして、これは、あなたの知識を完成させるために、アルゴリズムやコンパイラに関するいくつかの読書をする必要があることを伝えているかもしれません。

+0

再帰的降下が別の可能性であり、おそらく私の最初の選択ですが、それから私はすでにそれを行う方法を知っています;-) – EJP