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

JavaScriptのスタックデータ構造とは?LIFOの基本とクラス実装をわかりやすく解説

スタック(Stack)は、ほとんどのプログラミング言語で利用される抽象データ型(ADT:Abstract Data Type)の一つです。トランプのカードの山や皿の積み重ねのように、現実世界の「積み重ね」と同じように振る舞うことから、この名前が付けられました。

JavaScriptのスタックデータ構造とは?LIFOの基本とクラス実装をわかりやすく解説

スタックの特徴:LIFO(後入れ先出し)構造

スタックの最大の特徴は、操作できるのが片方の端だけであるという点です。この特性により、スタックは LIFO(Last-In-First-Out:後入れ先出し) 型のデータ構造として動作します。つまり、最後に追加された要素が最初に取り出されます。

スタックの用語では、要素を挿入する操作を PUSH(プッシュ)、要素を取り除く操作を POP(ポップ) と呼びます。

次の図は、スタックに対する一連の操作を示したものです。

JavaScriptのスタックデータ構造とは?LIFOの基本とクラス実装をわかりやすく解説

JavaScriptでスタッククラスを実装する

以下は、スタックを表す完全なJavaScriptクラスの実装例です。最大サイズの設定、空・満杯の判定、push・pop・peek・clearといった基本操作をすべて備えています。

class Stack {
    constructor(maxSize) { // サイズ未指定時はデフォルト値を設定
        if (isNaN(maxSize)) {
            maxSize = 10;
        }
        this.maxSize = maxSize; // スタックの値を格納する配列を初期化
        this.container = [];
    }
    display() {
        console.log(this.container);
    }
    isEmpty() {
        return this.container.length === 0;
    }
    isFull() {
        return this.container.length >= this.maxSize;
    }
    push(element) { // 満杯チェック
        if (this.isFull()) {
            console.log("Stack Overflow!");
            return;
        }
        this.container.push(element);
    }
    pop() { // 空チェック
        if (this.isEmpty()) {
            console.log("Stack Underflow!");
            return;
        }
        this.container.pop();
    }
    peek() {
        if (this.isEmpty()) {
            console.log("Stack Underflow!");
            return;
        }
        return this.container[this.container.length - 1];
    }
    clear() {
        this.container = [];
    }
}

各メソッドの役割

  • constructor(maxSize):スタックの最大サイズを設定します。引数が無効な場合はデフォルトで10が適用され、要素を格納する内部配列を初期化します。
  • isEmpty():スタックが空かどうかを真偽値で返します。
  • isFull():要素数が最大サイズに達しているかどうかを判定します。
  • push(element):新しい要素をスタックの末尾に追加します。満杯の場合は「Stack Overflow!」を出力して追加を防ぎます。
  • pop():末尾の要素を取り除きます。空の場合は「Stack Underflow!」を出力します。
  • peek():末尾の要素を削除せずに参照します。
  • clear():スタック内の全要素を消去します。

スタックの主な活用シーン

スタックは日常的な開発でも頻繁に登場する重要な概念です。代表的な活用例は以下の通りです。

  • 関数呼び出しを管理するコールスタック
  • ブラウザの戻る/進む履歴機能
  • エディタの元に戻す(Undo)/やり直し(Redo)機能
  • 数式の評価や括弧の対応チェックなどのアルゴリズム処理

LIFOというシンプルなルールだけで強力な処理を実現できるのがスタックの魅力です。まずは上記のサンプルコードを実際に動かしながら、その挙動を体感してみてください。

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

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

  2. ハーフエッジデータ構造(HalfedgeDS)とは?基本概念とCGAL実装例をわかりやすく解説

    はじめにテンプレートパラメータとして用いられるハーフエッジデータ構造(Halfedge Data Structure、略称 HalfedgeDS)は、頂点・辺・面の接続情報(インシデンス情報)を管理できる、辺を中心としたデータ構造として定義されています。平面地図(planar map)や多面体など、任意の次元空間に埋め込まれた向き付け可能な2次元曲面の表現に適した構造です。このデータ構造では、各辺が逆向きの向きを持つ2つのハーフエッジ(半辺)に分割されます。各ハーフエッジは、隣接する1つの面と1つの頂点への参照を保持し、逆に各面および各頂点にも、それぞれ1つの接続ハーフエッジが格納されます。さ