ttki's diary

プログラミング好きな人の日記です

逆ポーランド法-その後のその後...

こんにちは。もう、2015年になってから一ヶ月になってしまいますね。

何回も取り上げてきた逆ポーランド法ですが、ようやくコードがきれいに(一から書き直した笑)なったので、紹介しようと思います。

なんできれいになったのかというと、最近はじめた Javascript逆ポーランド法ソース(ネットにあったもの) を C++ に移植したからです(笑

さすがに自分できれいに作るには、無理がありました。

さっそくソースです。

Light_RPN_calc

簡単な、クラス説明

class RPN//逆ポーランド法計算クラス。
RPN::expr//計算式を代入 2*(12+32/431) etc...
double RPN::calc()// exprの式を計算。Double で返します。

#逆ポーランド法について

逆ポーランド法は、中間記法(普段使ってる式の表し方。12*15, 5/1-12 とか)とは違い、演算子を後ろに置きます。(12 21 + とか)

どうやって変換するのかというと、
12+43なら、まず先頭の12をストックします。(stack 12)
+がきたら、演算子は後ろに置く決まりなので、+はとりあえずほっといておきます。
43がきたので12の後ろに ストックします(stack 12 43) 数字がなくなったので、ほっといておいた+をストックします(stack 12 43 +) 結果的に、12 43 +となります。

12*43+1なら、*と+がありますが、乗算と除算は優先順位が高いので、+かーがきたら、その時点でストックします。説明が下手ですね笑
12*43+1
stack 12

stack 12 43

+ 乗算より優先順位の低い+がきたのでストックします。

stack 12 43 * +
stack 12 43 * + 1
よって、 12 43 * + 1 となります。

逆ポーランド法を計算して、答えを出すには、
日本語のような、計算をします。
分かり易く言うと、12と43をかけて1を足す。
日本人には、分かり易いですね。

#余談
最近,HTML/CSS/Javascript を始めました。
きっかけは、Firefox OSのアプリを作ってみたかったからです。
今は、ペイントソフトを作っています。 HTML5 ってすごいですね!