Keito

© 2024 Keito

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

両端キュー(基本操作)

両端からのアクセスが可能な双方向キューデータ構造の基本操作を学ぼう

O(1)
時間計算量
O(n)
空間計算量
中級
難易度
双方向
アクセス

🔧 操作設定

現在の両端キュー:
[1, 2, 3]
選択した操作:
pushBack(4)
サイズ:
3 要素
先頭:
1
末尾:
3
📚 両端アクセス: 先頭と末尾の両方から操作可能

📚 推奨操作例

🔄

両端キュー操作を実行してください

左側の設定パネルから操作を選択し、「両端キュー操作実行」ボタンを押してください

💻 実装例(JavaScript)

class Deque {
    constructor() {
        this.items = [];
    }
    
    // 先頭に要素を追加 - O(1)
    pushFront(element) {
        this.items.unshift(element);
        return this.items.length;
    }
    
    // 末尾に要素を追加 - O(1)
    pushBack(element) {
        this.items.push(element);
        return this.items.length;
    }
    
    // 先頭要素を取り出し - O(1)
    popFront() {
        if (this.isEmpty()) {
            throw new Error("両端キューが空です");
        }
        return this.items.shift();
    }
    
    // 末尾要素を取り出し - O(1)
    popBack() {
        if (this.isEmpty()) {
            throw new Error("両端キューが空です");
        }
        return this.items.pop();
    }
    
    // 先頭要素を確認(削除なし) - O(1)
    front() {
        if (this.isEmpty()) {
            return undefined;
        }
        return this.items[0];
    }
    
    // 末尾要素を確認(削除なし) - O(1)
    back() {
        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();
    }
}

// 使用例
const deque = new Deque();

// 両端から要素の追加
deque.pushBack(2);   // [2]
deque.pushFront(1);  // [1, 2]
deque.pushBack(3);   // [1, 2, 3]
deque.pushFront(0);  // [0, 1, 2, 3]

console.log(deque.display()); // [0, 1, 2, 3]

// 両端の要素確認
console.log(deque.front()); // 0
console.log(deque.back());  // 3

// 両端から要素の削除
console.log(deque.popFront()); // 0 → [1, 2, 3]
console.log(deque.popBack());  // 3 → [1, 2]

console.log(deque.display()); // [1, 2]

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

// スタックとしての使用(pushBack, popBack)
deque.pushBack(4);
deque.pushBack(5);
console.log(deque.popBack()); // 5 (LIFO)

// キューとしての使用(pushBack, popFront)
deque.pushBack(6);
console.log(deque.popFront()); // 1 (FIFO)

🎯 両端キューの特徴

基本特性

  • • 両端からの追加・削除が可能
  • • すべての基本操作がO(1)で高速
  • • スタックとキューの機能を統合
  • • 柔軟なデータアクセスパターン

実世界での応用

  • • ブラウザの履歴管理(前進・後退)
  • • アンドゥ・リドゥ機能の実装
  • • スライディングウィンドウ
  • • 回文判定アルゴリズム

💡 ポイント: 両端キューはスタックとキューの最良の特徴を併せ持ち、 より柔軟なデータアクセスを可能にします。