- ベストアンサー
逆ポーランド表記ってなんですか?
で通常の表記から逆ポーランド表記へはどうやって変換したらいいですか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
基本はNo.1示したURLのとおりで、人間が変換する場合はこれでOKですね。 プログラムで行う場合は、演算子に優先順位をつけておきます。 つまり、+と-は同順位で、+,-より*/は上位ですね。 またスタックを用意しておきます。 さて、決まったら以下の繰り返し作業をするだけです。 1)数字はそのまま出力 2)演算子Aがきたら、 a)演算子Aの優先順位 < スタックの一番上(つまり一番最近積んだ)の演算子の優先順位 ならば、同順位以下になるまでスタックより出力して、演算子Aをスタックに積む b)上記以外の時には無条件に演算子Aをつむ 3)括弧(がきたらそのままスタックに積む 4)括弧)がきたら、括弧(までを出力して括弧(は廃棄 5)関数はひとまとまりの数値として扱う (特別な処理が必要になります。つまり引数がひとつの時はまだよいのですが、2つ以上だと困難となりますので) 6)同様に -5, -6 などの数値の前の-は演算子ではなく、まとめて数値としてみなす。 以上です。
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
普通小中高で習う演算は演算される数オペランドa,bについて a+b,a*bのように、演算子を間に挟むので間置記法(正確には 挿入記法)です。演算子をオペランドの後に記す記法が考えられます。例えばab+,ab*のように。そんな特異な考え方が威力を 発揮するのは、コンピューター(電卓を含む)時代になって、(A) プログラム演算が簡単になるため(B)カッコが有る式もカッコが不要になるためである。 もう1つ重要な考え方に「スタック」(棚)という概念がありそれと密接に 絡んでいる。PRN=PolishReverseNotation. PRNに直す方法ロジックは出たので、その後(後段)を述べます。 (a+b)*(c-d)はRPNではab+cd-*となります。 この例でプログラム化する方法ロジックを考えました。 (1)演算子と2項・単項の区別表と演算サブルーチンを用意する。 演算子の優先順位の表は不要。 (2)左最初より演算子を探す。ab+の+で見つかる。 (3)見つかれば(+)、その直前の2つの値(単項演算子なら1個) (a,b)をデータとして、演算する。a+b=x (4)結果の値(x)を、ab+は消して、「その元の位置のところへ」挟みこむ。xcd-*とする。 (5)ポインターを次ぎのcより右に進め、演算子を探し-に出会う。 (6)前記(3)と同じことを行う。c-d=y (7)前記(4)と同じことを行う。xy*となる。 (8)前記(2)と同じことを行い*に出会う。 (3)と同じことを行う。x*y=zが出る。 (9)前記(4)と同じことを行う。zとなる。 (10)その後zの次ぎは最後で、終了。 スタックをpush,popで使っていないが、(4)の「もとの位置へ挟みこむ」必要があるので使えなかった。また値のスタックと演算子のスタックは分けないほうが良いのだと思う。WEB検索での解説は大学の講義関連が多く、それにはあまり上記まで解説していない。今後さらに研究します。
- borg
- ベストアンサー率56% (42/75)
通常の数式を演算する順番に、引数,演算子の順に記していく手法です。 例えば 9+3 ・・・ 9 3 + と記します。 わかり易く説明してくれている方のURLがありますので参考にしてください。