• ベストアンサー

逆ポーランド記法

C言語で逆ポーランド記法への変換をしようとしています. 演算子の優先順位の付け方がわかりません. 構造体の配列に数式を入れて,それぞれに優先度をつけてみたりしたのですが,いい方法でないように思います. 適切な方法を知っている方よろしくお願いします.

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

逆ポーランド記法の特徴、演算子の優先順位など↓ http://ja.wikipedia.org/wiki/%E9%80%86%E3%83%9D%E3%83%BC%E3%83%A9%E3%83%B3%E3%83%89%E8%A8%98%E6%B3%95 逆ポーランド記法(後置記法)変換プログラムの例↓ http://www.sra.co.jp/people/miyata/algorithm/postfix.txt

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

LR系の解析手法では「スタックを使って」解析しています. 式の解析に限定しちゃえば「演算子順位解析」あたりが簡単かな. フルスペックの LR を使うほどじゃないし. もちろん LL系, 例えば再帰下降解析も「スタックを使ってる」と言い張ることは可能です.

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

>演算子の優先順位はどのように考えればいいのでしょうか? 乗除算は加減算よりも優先順位が高い とかいうのを使いたい全部の演算子で関係が壊れないように決めればいいだけですが? 左結合の演算子と右結合の演算子(べき乗とか)や、同じ順位の演算子を どうするかという問題はありますけどね。 VB.NET - katamari soulware http://katamari.jp/soulware/index.php/post/category/programming/vbnet 電卓のアルゴリズム http://www.di.takuma-ct.ac.jp/~miyatake/open/calc/calcsimu.html

noname#75489
noname#75489
回答No.3

> スタックを使うのも作ってみたいのですが,演算子の優先順位はどのように考えればいいのでしょうか? スタックは変換した逆ポーランド記法の計算で試してみるのがよいかと思います。

参考URL:
http://www.sm.rim.or.jp/~shishido/pol.html
noname#75489
noname#75489
回答No.1

二分木を使えば効率よく実装できると思います。

参考URL:
http://smdn.invisiblefulmoon.net/ikimasshoy/cpp/polish.html
shina5963
質問者

お礼

ありがとうございます. 早速,作ってみようと思います. スタックを使うのも作ってみたいのですが,演算子の優先順位はどのように考えればいいのでしょうか?

関連するQ&A

  • 逆ポーランド記法

    電卓もどきのアルゴリズムを教えて下さい 指定された数式を解読して、演算結果を求める処理を作成したいのですが・・・・ 今考えている手順は (1) 数式を解析して 逆ポーランド記法の中間言語にして於いておく (2) 逆ポーランド記法の中間言語を演算して答えを求める と考えているのですが・・・ << 例 >>  演算式 1+2×3=    答え 7  演算式 (1+2)×3=  答え 9 大昔の知識ですのでもっとシンプルな方法が有りましたらアドバイス頂けませんでしょうか?

  • 逆ポーランド記法の優先順位

    問題 X=(A+B)×(C-D÷E)を逆ポーランド記法へ 解説1)計算の優先順位を考える X=(A+B)×(C-D÷E) │   │    └┬─┘ │   └──┬──┘ └──────┘ 2)優先順に逆ポーランド記法に変換(A+B→AB+) A+B → AB+ D÷E → DE÷・・・つづく 優先順位はどうやって判断するのですか。知っている方お願いします。

  • ポーランド記法、逆ポーランド記法のプログラム

    ポーランド記法、逆ポーランド記法のプログラムがわかる方、是非教えてくださいm(__)m 言語は何でもいいのでお願いします~

  • ポーランド記法(前置記法)のアルゴリズム

    ポーランド記法を使用した計算のアルゴリズムについて教えてください。 逆ポーランド記法についてはたくさんの資料が存在しますが、ポーランド記法については資料がないのでどのように考えたらよいのかわかりません。 スタック又は木構造を用いて計算するアルゴリズムをお願い致します。

  • 逆ポーランド記法の変換法

    以前逆ポーランド記法の優先順位について質問したのですが、いまいち変換法が分かりません。 例1 A+B*(C+D)+E →ABCD+*+E+ ABとCDがなぜ一緒になるのか。 例2 (A+B)*(C-D)→AB+CD-* なぜ例1のABとCDは、ABCDになって、こっちはAB+CDなのか。なぜ*が一番後ろなのか。参考書は2冊ありますが、見ても?です。手順を詳しく説明して頂ける方、よろしくお願いします。

  • 逆ポーランド記法について

    学校で A=(B-C)/D+E*Fを逆ポーランド記法で書くのを講師が ABC-DE+F*/= と書いたのですが/の位置は ABC-D/E+F*= こう書くのだと思ったのですが何が違うのでしょうか?

  • 逆ポーランド記法における単項演算子などの処理

    開いていただきありがとうございます。 質問内容は題名の通りなのですが、 中置記法の式を逆ポーランド記法に変換して計算を行う際に単項演算子をどのように扱うかで悩んでいます。+-などのように文脈に応じて意味合いが変化するものもあり、もうひとつスマートに処理することができません。 また前置・後置インクリメントなどに対応するとしたらなおざりに処理するわけにもいきませんし、三項演算子に至ってはどのように処理すればいいのかさっぱりです。 電卓に留まらず、簡単な処理系に組み込むという前提で、これらをどのように使えばよいかご教示いただければと存じます。

  • VB6.0で逆ポーランド記法のソースコードを教えてください

    VB6.0で逆ポーランド記法のソースコードを教えてください。 できれが、通常の計算式から逆ポーランドに変換して計算結果が求められるまで。 お願いします。

  • 逆ポーランド記法への変換方法を教えてください。

    Visual Studio C++ 6.0で逆ポーランド電卓のプログラムを作っていますが、式の変換方法がわからないので教えていただければ助かります。 たとえば (8 + 9 * -8) * 10 だと 8 9 -8 * + 10 * に変換できますが、  -(8 + 9 * -8) * 10 だとどう変換すればよいのかがわかりません。

  • 電卓ソフトを作るには逆ポーランド法で良いのですか?

     プログラミングの勉強をしながら式入力型の電卓を作りたいと思い調べたところ「逆ポーランド法」を知りました。  まず四則演算出来るものを作り最終的には関数電卓を目指そうと思っているのですが、この「逆ポーランド法」を取り入れた計算プログラムを学べば良いのでしょうか?もっと適している他の手法はありますか? 公開されている式入力型の電卓ソフトはどのような手法でプログラムされているのでしょうか?(なかなか式入力型のサンプルが見つからなくて…。)  言語はActiveBasicを使用していますが、情報が少ない為VisualBasicのサイトで勉強しています。 宜しくお願いいたします。

専門家に質問してみよう