JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptのスタックを使った逆ポーランド記法(RPN)計算機の実装方法

逆ポーランド記法(RPN)計算機とは

JavaScriptのスタック(Stack)データ構造を活用して、RPN(Reverse Polish Notation:逆ポーランド記法)入力方式の計算機を作成する方法を解説します。逆ポーランド記法は演算子を被演算子の後ろに置く記法で、括弧が不要になり、スタックを使った実装と非常に相性が良いのが特徴です。

入力配列の例

まず、次のような入力配列を考えてみましょう。

const arr = [1, 5, '+', 6, 3, '-', '/', 7, '*'];

処理の流れ

  • 1 はオペランド(被演算子)なので、スタックにプッシュします。
  • 5 はオペランドなので、スタックにプッシュします。
  • '+' は演算子なので、スタックから 1 と 5 をポップして加算し、結果をスタックにプッシュします。
  • 6 はオペランドなので、スタックにプッシュします。
  • 3 はオペランドなので、スタックにプッシュします。
  • '-' は演算子なので、スタックから 6 と 3 をポップして減算し、結果をスタックにプッシュします。
  • '/' は演算子なので、スタックから 6 と 3 をポップして除算し、結果をスタックにプッシュします。
  • 7 はオペランドなので、スタックにプッシュします。
  • '*' は演算子なので、スタックから 2 と 7 をポップして乗算し、結果をスタックにプッシュします。

最終的にスタックに残る値、つまり出力結果は以下のとおりです。

const output = 14;

実装コード例

この計算機は次のように実装できます。

const arr = [1, 5, '+', 6, 3, '-', '/', 7, '*'];
const stackCalculator = (arr = []) => {
  const options = {
    '+': (a, b) => a + b,
    '-': (a, b) => a - b,
    '*': (a, b) => a * b,
    '/': (a, b) => a / b
  };
  const stack = [];
  arr.forEach(value => {
    stack.push(value in options
      ? options[value](...stack.splice(-2))
      : value
    );
  });
  return stack;
};
console.log(stackCalculator(arr));

コードのポイント

この実装の鍵となるのは stack.splice(-2) の部分です。配列の末尾から2つの要素(最後にプッシュされた2つのオペランド)を取り出し、それらを演算子に対応する関数へ渡しています。演算子ごとの処理はオブジェクト options にまとめられているため、%(剰余)や **(べき乗)など、新しい演算子の追加も簡単に行えます。

実行結果

コンソールには以下のように出力されます。

[14]
  1. JavaScriptのimportで波括弧「{}」を使う理由とは?名前付きエクスポートの基本をわかりやすく解説

    JavaScript(ESモジュール)でモジュールを読み込む際、import 文に波括弧 { } を付けるかどうか迷ったことはありませんか?実はこの波括弧は、名前付きエクスポート(named export)を読み込むために必要な記法です。本記事では、実際のコード例を使いながら、{ } の役割と使い方を詳しく解説します。 importで { } を使う場面とは JavaScriptのESモジュールでは、エクスポート方法によって読み込み側の書き方が変わります。 名前付きエクスポート:export { 関数名 } のようにエクスポートされたものを読み込む場合は、import { 名前 } fro

  2. JavaScriptでスタックを実装する方法【サンプルコード付きで解説】

    スタック(Stack)は、最後に追加した要素が最初に取り出される「LIFO(Last In, First Out)」方式の基本的なデータ構造です。本記事では、JavaScriptを使ってスタックを実装する方法を、ブラウザ上で実際に動作するサンプルコードとともにわかりやすく解説します。 スタックの基本操作 push:スタックの一番上に新しい要素を追加します。 pop:スタックの一番上から要素を取り出して削除します。要素がない場合はアンダーフローとして扱います。 display:スタック内に格納されているすべての要素を表示します。 サンプルコード 以下は、JavaScriptでスタックを実装し