見出し画像

逆ポーランド記法とかいう意味わからんネーミング

初めてこの概念を知った時、
どこがポーランドなんだよwww何が逆なんだよwww
と思った記憶がある。もうネーミングだけでおもしれぇ、気に入った。絶対理解しちゃるってね。大変私好みなネーミングである。素晴らしい。

で、逆ポーランド記法って結局何なんだよ

ぶっちゃけWikipediaを見た方が早いと思うが、一応解説する。逆ポーランド記法とは数式やプログラムの記法の一種である。一般的に使用される計算の記法は以下である(はずである)。
1 + 1
この記法は中置記法という。演算子を被演算子の中間に記述する記法である。これに対し、演算子を被演算子の前に記述する記法がある。
+ 1 1
これを前置記法という。これのもう一つの名前がポーランド記法である。ポーランド人の論理学者ヤン・ウカシェヴィチ (Jan Łukasiewicz) が考案したことによるらしい。誰だよ。いや、界隈では有名なのかも知らんけど。
もう想像がついたと思うが、逆ポーランド記法とはポーランド記法の逆、つまり演算子を被演算子の後に記述する記法のことを指す。
1 1 +
もちろん、後置記法ともいう。いや、初めから後置記法で良いやろがい。まぁ、私は逆ポーランド記法とかいうネーミングが大変気に入っているので、頑なに逆ポーランド記法と言い続けるけどもね。ネットでも逆ポーランド記法って書いてあるサイト多いし。

え、中置法でよくない?

それが意外とよくない。ネーミングの面白さで見つけた変わり者以外は、大抵「電卓」を作成しようとして計算の処理方法が分からず、逆ポーランド記法にたどり着く。逆ポーランド記法で記述する大きな利点は演算の優先順位を括弧無しで指定できることである。
たとえば、(2+5) * (3+2)は
2 5 + 3 2 + *
となる。これがプログラミングでは大変ありがたい。何がありがたいのかというと、「スタックにデータを積む (PUSH) 操作」、「スタックからデータを下ろす (POP) 操作」、「二つのオペランド間の演算」だけで計算動作が可能になることがありがたい。一つのメソッドで処理がまとまる上に、掛け算・割り算のところを優先して…みたいなややこしい処理が一切いらなくなるのである。最高か?

ちょっと細かげに解説しちゃろう

スタックについては別で見てくれ。ここでは「ありき」で話したい。めんどいから。基本的な考え方は「数字はPUSHし」て、「オペランドはPOPする」である。先の「2 5 + 3 2 + *」を基に話していきたい。
1.2を読み込む。2は数字なのでスタックにプッシュする。
   [2]
2.5を読み込む。5は数字なのでスタックにプッシュする。
   [2,5]
3.+を読み込む。+はオペランドなのでスタックの数字を上(トップ)から二つ取り出し、計算する。計算結果をスタックにプッシュする。
   [7]
4.3を読み込む。スタックにプッシュする。
   [7,3]
5.2を読み込む。スタックにプッシュする。
   [7,3,2]
6.+を読み込む。スタックの数字を上(トップ)から二つ取り出し、計算する。計算結果をスタックにプッシュする。
   [7,5]
7.*を読み込む。スタックの数字を上(トップ)から二つ取り出し、計算する。計算結果をスタックにプッシュする。
   [35]
これによって計算結果の「35」が得られる。一見分かりにくいが、一度メソッド化すればどんな計算も処理できるため、便利さはとんでもない。

で、コードは?

気が向いたら記事にするわい……
いや、簡単な電卓自体は大学生時代に作ったため、コードはあるのだが、正直コードの詳細を忘れた。なんか無駄にGUIだし。分かりづれぇ。作り直すかは未定だが、せめて過去の自分のコードを解読しないと記事にできない。すんません。そういえばスタックとかキューとか簡単なアルゴリズムについてまとめてなかったので、それを先に記事にします。わっしょい。

この記事が気に入ったらサポートをしてみませんか?