目的
rubyで+(足し算)、ー(引き算)、*(掛け算)、/(割り算)を行える電卓のアルゴリズムを考えてみた。
電卓のアルゴリズムを作り方で一番有名な方法が、
①与えられた計算式を受け取る→②逆ポーランド記法に変換する→③演算し計算結果を返す。
今回はこの②から③にかけての私なりの考え方を紹介していきます。なお、実際のところ私自身が初心者なので何かと間違いがありましたらご指摘よろしくお願いします。
アルゴリズムの考え方とそのコード
1. 逆ポーランド記法で表された計算式標準入力で受け取る。
input = gets.chomp.split(" ")
※逆ポーランド記法(後置記法)とは、1 2 +や 2 6 *などのように演算子を数値の後ろに置く計算式。ちなみに普段私たちが目にするのは中置記法と言われ、演算子が真ん中にある1 + 2や2 * 6 といったものである。
2. あとで演算子かどうか判断するために予め演算子の配列を作っておく.それと同時に数値を保管するスタックも作っておく。
operator = ['+','-','*','/']
num_stack = []
2.受け取った計算式をループで回し、数値がきたらスタックにpushし、演算子が来たらスタック内の数値を二つpopし各演算を行い、その計算結果をスタックにpushする。
input.each do |s|
#もし数値がきたらスタックに入れる(正規表現を用いている)。
if s =~ /[0-9]/
num_stack << s
end
#もし演算子が来たらスタックから二つの数値を取り出し、各演算子に沿って計算する。
if operator.include?(s)
a = num_stack.pop
b = num_stack.pop
a = a.to_i
b = b.to_i
case s
when '+'
num_stack << b + a
when '-'
num_stack << b - a
when '*'
num_stack << b * a
when '/'
num_stack << b / a
end
end
end
3. 最後にスタックに残った数値が計算結果となる。
ans = num_stack.pop
puts ans