最近ちょっとした電卓アプリでも出そうかと考え、作成するときに利用したアルゴリズムです。
逆ポーランド記法(以下RPN)のアルゴリズムを用いれば、計算式で掛け算や割り算を含む場合そちらを優先的に計算できます。

・例

通常
  5 + 4 - 2
RPN
  5 4 2 - +

通常
  5 + 4 × 2 - 1
RPN
  5 4 2 × 1 - +

通常
  5 + 4 × 2 - 1 ÷ 3
RPN
  5 4 2 × 1 3 ÷ - +

このように演算子を数値の後ろに置き、掛け算割り算を優先的に計算できます。


・演算子の優先度

÷ = × > + = -

・式の変換

計算式を読み込み、RPNの並び順にするときの配列を用意しておきます。
演算子を読み込んだ場合は別の配列(スタック)に一時的に格納します。

1.数値の場合はそのまま配列に格納
2.演算子を読みこんだ場合はスタック先頭の演算子と優先度を比較。スタックの先頭の優先度が低ければスタックの演算子を配列に格納。その後、読みこんだ演算子をスタックの先頭から格納。
3.計算式の最後に到達すればスタックをすべて配列に格納。


とざっくり言葉で説明してもわからないと思うので、例を用いて説明します。
先ほどの例の一番最後の式で説明します。

計算式 : 5 + 4 × 2 - 1 ÷ 3
配列 :
スタック :


・数値を読み込み配列に格納
計算式 : + 4 × 2 - 1 ÷ 3
配列 : 5
スタック :

・演算子を読み込むがスタックに演算子がないためそのまま格納
計算式 : 4 × 2 - 1 ÷ 3
配列 : 5
スタック : +

・数値を読み込み配列に格納
計算式 : × 2 - 1 ÷ 3
配列 : 5 4
スタック : +

・演算子を読み込みスタックの先頭と比較、スタック先頭の演算子よりも優先度が高いためスタックの先頭に格納
計算式 : 2 - 1 ÷ 3
配列 : 5 4
スタック : × +

・数値を読み込み配列に格納
計算式 : - 1 ÷ 3
配列 : 5 4 2
スタック : × +

・演算子を読み込みスタックの先頭と比較、スタック先頭の演算子よりも優先度が低いためスタックの先頭の演算子を配列に格納、読み込んだ演算子をスタックの先頭に格納
計算式 : 1 ÷ 3
配列 : 5 4 2 ×
スタック : - +

・数値を読み込み配列に格納
計算式 : ÷ 3
配列 : 5 4 2 × 1
スタック : - +

・演算子を読み込みスタックの先頭と比較、スタック先頭の演算子よりも優先度が高いためスタックの先頭に格納
計算式 : 3
配列 : 5 4 2 × 1
スタック : ÷ - +

・数値を読み込み配列に格納
計算式 :
配列 : 5 4 2 × 1 3
スタック : ÷ - +

・計算式の最後に到達したのでスタックをすべて配列に格納
計算式 :
配列 : 5 4 2 × 1 3 ÷ - +
スタック :

これでRPNの変換ができました。

・計算

実際にRPNを用いて計算してみます。
解法は演算子を見つけたらその前の2つの値を計算するだけです。

5 4 2 × 1 3 ÷ - +

5 8 1 3 ÷ - +

5 8 0.3333… - +

5 7.6666… +

12.6666…