Keito

© 2024 Keito

技術ブログとポートフォリオ

スタック(基本操作)

LIFO(Last In, First Out)原理に基づくスタックデータ構造の基本操作を学ぼう

O(1)
時間計算量
O(n)
空間計算量
初級
難易度
LIFO
原理

🔧 操作設定

現在のスタック:
[1, 2, 3]
選択した操作:
push(4)
スタックサイズ:
3 要素
📚 LIFO: 最後に入れた要素が最初に取り出される

📚 推奨操作例

📚

スタック操作を実行してください

左側の設定パネルから操作を選択し、「スタック操作実行」ボタンを押してください

💻 実装例(JavaScript)

class Stack {
    constructor() {
        this.items = [];
    }
    
    // 要素を先頭に追加 - O(1)
    push(element) {
        this.items.push(element);
        return this.items.length;
    }
    
    // 先頭要素を取り出し - O(1)
    pop() {
        if (this.isEmpty()) {
            throw new Error("スタックが空です");
        }
        return this.items.pop();
    }
    
    // 先頭要素を確認(削除なし) - O(1)
    peek() {
        if (this.isEmpty()) {
            return undefined;
        }
        return this.items[this.items.length - 1];
    }
    
    // スタックが空かどうかを確認 - O(1)
    isEmpty() {
        return this.items.length === 0;
    }
    
    // 要素数を取得 - O(1)
    size() {
        return this.items.length;
    }
    
    // スタックの内容を表示
    display() {
        return this.items.slice().reverse(); // 先頭が上になるように表示
    }
}

// 使用例
const stack = new Stack();

// 要素の追加
stack.push(1);
stack.push(2);
stack.push(3);
console.log(stack.display()); // [3, 2, 1] (先頭が上)

// 先頭要素の確認
console.log(stack.peek()); // 3

// 要素の取り出し
console.log(stack.pop()); // 3
console.log(stack.display()); // [2, 1]

// 状態の確認
console.log(stack.size()); // 2
console.log(stack.isEmpty()); // false

🎯 スタックの特徴

基本特性

  • • LIFO(Last In, First Out)原理
  • • すべての基本操作がO(1)で高速
  • • 一方向(先頭)からのみアクセス
  • • メモリ効率が良い

実世界での応用

  • • 関数呼び出しのコールスタック
  • • ブラウザの戻るボタン履歴
  • • 数式の括弧チェック
  • • アンドゥ機能の実装

💡 ポイント: スタックは最も基本的なデータ構造の一つで、 プログラミングの多くの場面で活用されています。