読み込み中...

【TypeScript】キューをマスターする徹底ガイド10選!

TypeScriptで学ぶキューの基本から応用までのサンプルコードのイラスト TypeScript
この記事は約29分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

TypeScriptは近年のフロントエンド開発を中心に急速に普及している言語であり、JavaScriptのスーパーセットとして、静的型付けや最新のECMAScript機能を備えています。

一方、キューは情報処理の分野で古くから利用されている基本的なデータ構造の一つです。

今回の記事では、TypeScriptでキューをどのように実装・操作するのかを、初心者でも理解できるように詳細に解説します。

具体的なサンプルコードとともにキューの基本から応用までを学んでいきましょう。

●TypeScriptとキューとは

TypeScriptとは、Microsoftが開発したオープンソースの言語であり、JavaScriptに静的型機能やクラスベースのオブジェクト指向を導入したものです。

TypeScriptは、大規模アプリケーションの開発や、より安全なコードを記述する際に非常に役立ちます。

また、TypeScriptのコードは、JavaScriptにトランスパイルされ、ブラウザやNode.jsで実行することができます。

一方、キューはデータ構造の一つで、先入れ先出し(First In, First Out: FIFO)の原則に基づいてデータを管理します。

データを追加する操作を「enqueue」、データを取り出す操作を「dequeue」と呼びます。

キューは、実世界の様々なシーン(例:待ち行列、ジョブの順番など)でモデル化されることが多いです。

○TypeScriptの基本

TypeScriptは、JavaScriptのすべての機能に加えて、静的型機能やインターフェース、ジェネリクスなどの高度な機能を持っています。

例えば、次のコードはTypeScriptを使用して、数値の配列の合計値を計算する関数を示しています。

function sumOfArray(arr: number[]): number {
    return arr.reduce((acc, val) => acc + val, 0);
}

const numbers = [1, 2, 3, 4, 5];
console.log(sumOfArray(numbers));  // このコードを実行すると、15という結果が出力されます。

このコードでは、sumOfArray関数の引数arrnumber[]という型注釈をつけています。

これにより、arrは数値の配列であることが保証され、型の不整合がある場合はコンパイル時にエラーが出力されます。

○キューの基本概念

キューは、データを順序付けて一時的に保持するためのデータ構造です。

データはキューの最後尾に追加され、最前部から取り出されるという特性を持ちます。

このような動作をFIFO(先入れ先出し)と言います。

例えば、スーパーマーケットのレジ待ち行列を考えてみましょう。

レジに並んだ順に商品を精算することができるのと同じように、キューでもデータが追加された順に取り出すことができます。

キューの主な操作は次の2つです。

  1. enqueue:キューの最後尾にデータを追加します。
  2. dequeue:キューの最前部のデータを取り出します。

キューは、コンピュータのタスクスケジューリングやデータパケットのネットワーク伝送など、多くのアプリケーションで使用されています。

●キューの実装方法

キューはデータ構造の一つで、最初に入れたデータが最初に出てくる、いわゆる先入れ先出し(FIFO: First In First Out)の特性を持っています。

今回は、プログラミング言語としてのTypeScriptの特性を活かして、キューの実装を解説していきます。

TypeScriptを使用する理由としては、静的型付けの特性が挙げられ、これによりデータ構造の実装がより安全に行えます。

○サンプルコード1:基本的なキューの実装

まず、基本的なキューの実装をTypeScriptで行ってみましょう。

このコードでは、キューの基本的な操作であるenqueue(データを追加)とdequeue(データを取り出す)の2つのメソッドを持つクラスを作成します。

class Queue<T> {
    private items: T[];

    constructor() {
        this.items = [];
    }

    // データをキューの最後に追加
    enqueue(element: T): void {
        this.items.push(element);
    }

    // キューの最初のデータを取り出す
    dequeue(): T | undefined {
        return this.items.shift();
    }
}

このコードでは、汎用性を高めるためにジェネリクスを用いています。

<T>という表記は、このクラスが任意の型Tを持つデータを扱えることを表しています。

例えば、数値のキューを作成する場合や文字列のキューを作成する場合など、様々な型のデータをこのキューで扱うことができます。

このコードを実行すると、キューの実装が行われます。具体的な使用方法としては、次のようにキューにデータを追加したり取り出したりすることができます。

const numberQueue = new Queue<number>();

numberQueue.enqueue(1);
numberQueue.enqueue(2);
numberQueue.enqueue(3);

console.log(numberQueue.dequeue()); // 1
console.log(numberQueue.dequeue()); // 2
console.log(numberQueue.dequeue()); // 3

上記のコードを実行すると、最初に追加したデータが最初に取り出されることが確認できます。

これにより、キューのFIFOの特性が正しく実装されていることがわかります。

○サンプルコード2:enqueueとdequeueの操作

キューは、FIFO(First In, First Out)原則に基づくデータ構造であり、新しい要素は最後に追加され、最初に追加された要素が最初に削除されます。

キューに要素を追加する操作を「enqueue」といい、キューから要素を取り出す操作を「dequeue」といいます。

それでは、TypeScriptを用いて、enqueueとdequeueの操作を実装する具体的な方法を見ていきましょう。

// キューをクラスとして実装
class Queue<T> {
    private items: T[] = [];

    // enqueue操作: キューの最後に要素を追加
    enqueue(element: T) {
        this.items.push(element);
    }

    // dequeue操作: キューの最初の要素を取り出し
    dequeue(): T | undefined {
        return this.items.shift();
    }

    // キューが空かどうかを確認
    isEmpty(): boolean {
        return this.items.length === 0;
    }

    // キューの中身を確認
    view(): T[] {
        return this.items;
    }
}

const myQueue = new Queue<number>();

// 3をキューに追加
myQueue.enqueue(3);
// 5をキューに追加
myQueue.enqueue(5);
// キューの先頭の要素を取り出し
const removedElement = myQueue.dequeue();

このコードでは、Queueクラスを使って〇〇しています。

まず、Queueクラスを定義しており、このクラス内にenqueueメソッドとdequeueメソッドが定義されています。

enqueueメソッドは、キューの最後に要素を追加するためのメソッドで、dequeueメソッドはキューの最初の要素を取り出すためのメソッドです。

このコードを実行すると、myQueueという名前のキューが作成され、3と5という2つの数値が順番に追加されます。

そして、dequeueメソッドを使って、キューの先頭の要素である3が取り出されます。

その結果、myQueueの中身は[5]となります。

○サンプルコード3:キューのサイズ取得

キューは、データ構造の一つで、データの追加と取り出しを行う際のルールが特定の方法に従うものを指します。

特に、キューではデータの追加は末尾に、データの取り出しは先頭から行うという特性があります。

そのため、データの流れが先入れ先出し(FIFO:First In First Out)となります。

キューを使う際に、実際にどれだけのデータがキューに格納されているのか、また、そのサイズを確認することは非常に重要です。

TypeScriptでキューのサイズを取得するサンプルコードを紹介します。

class Queue<T> {
    private items: T[] = [];

    // データを追加するメソッド
    enqueue(item: T) {
        this.items.push(item);
    }

    // キューのサイズを取得するメソッド
    size(): number {
        return this.items.length;
    }
}

// キューのインスタンスを作成
const numberQueue = new Queue<number>();

// データを追加
numberQueue.enqueue(1);
numberQueue.enqueue(2);
numberQueue.enqueue(3);

// キューのサイズを取得して表示
console.log(`キューに格納されているデータの数:${numberQueue.size()}`);

このコードでは、TypeScriptのジェネリクスを使って汎用的なキューを実装しています。

具体的には、<T>という部分でデータの型を指定できるようにしています。

キューのサイズ取得に関しては、sizeメソッドを定義しており、このメソッドを呼び出すことでキューに格納されているデータの数を取得することができます。

このコードを実行すると、キューに格納されているデータの数がコンソールに表示されます。

具体的には、3つのデータ(1, 2, 3)をキューに追加しているので、コンソールに「キューに格納されているデータの数:3」と表示されることになります。

●キューの応用例

キューはその特性上、さまざまな場面での応用が考えられます。

それでは、キューを用いたいくつかの応用例を、TypeScriptのサンプルコードとともに解説していきます。

○サンプルコード4:優先度付きキューの実装

優先度付きキューは、通常のキューとは異なり、各要素に優先度が付与されています。

データを追加するときに優先度も指定し、データを取り出すときには優先度の高いデータから順に取り出されます。

class PriorityQueue<T> {
    private items: {element: T, priority: number}[] = [];

    enqueue(element: T, priority: number): void {
        let queued = false;

        for (let i = 0; i < this.items.length; i++) {
            if (this.items[i].priority > priority) {
                this.items.splice(i, 0, {element, priority});
                queued = true;
                break;
            }
        }

        if (!queued) {
            this.items.push({element, priority});
        }
    }

    dequeue(): T | undefined {
        return this.items.shift()?.element;
    }
}

const pq = new PriorityQueue<string>();
pq.enqueue("Task1", 2);
pq.enqueue("Task2", 1);
pq.enqueue("Task3", 3);

console.log(pq.dequeue());
console.log(pq.dequeue());
console.log(pq.dequeue());

このコードでは、PriorityQueueクラスを作成しています。

このクラス内部には、要素とその優先度を持つオブジェクトの配列が存在します。

enqueueメソッドを使ってデータを追加する際に、指定した優先度に基づき適切な位置にデータが挿入されます。

dequeueメソッドを使用してデータを取り出すと、優先度の高いデータから順に取得することができます。

このコードを実行すると、優先度に基づいてTask2, Task1, Task3の順にデータが出力されます。

つまり、enqueueで追加された順番とは異なり、優先度が最も高いデータから取得されることが確認できます。

○サンプルコード5:キューを用いたジョブスケジューリング

TypeScriptを用いてプログラミングを行う際、キューは多くのアプリケーションで利用される重要なデータ構造の一つです。

ここでは、キューを用いたジョブスケジューリングの方法を解説します。

ジョブスケジューリングは、タスクやジョブが順番に処理されるように管理するプロセスのことを指します。

キューを使用することで、ジョブが到着する順番に処理することができ、待機中のジョブは順番が来るまでキューに保持されます。

ジョブスケジューリングを模倣するためのサンプルコードを紹介します。

class Job {
  constructor(public id: number, public description: string) {}
}

class JobQueue {
  private jobs: Job[] = [];

  enqueue(job: Job): void {
    this.jobs.push(job);
  }

  dequeue(): Job | null {
    if (this.jobs.length === 0) {
      return null;
    }
    return this.jobs.shift()!;
  }

  peek(): Job | null {
    return this.jobs.length > 0 ? this.jobs[0] : null;
  }

  isEmpty(): boolean {
    return this.jobs.length === 0;
  }

  size(): number {
    return this.jobs.length;
  }
}

// サンプルコードの使用例
const jobQueue = new JobQueue();
jobQueue.enqueue(new Job(1, "メールの送信"));
jobQueue.enqueue(new Job(2, "データベースの更新"));
jobQueue.enqueue(new Job(3, "画像の変換"));

このコードでは、JobクラスとJobQueueクラスを使ってジョブスケジューリングを行っています。

Jobクラスはジョブの情報を保持し、JobQueueクラスはジョブの管理を担当します。

enqueueメソッドは新しいジョブをキューの末尾に追加します。

一方、dequeueメソッドはキューの先頭のジョブを取り出して返します。

また、キューの先頭のジョブを参照するだけで取り出さない場合は、peekメソッドを使用します。

キューが空かどうかを確認するためにはisEmptyメソッドを、キューのサイズを取得するためにはsizeメソッドを使用します。

サンプルコードの使用例では、3つのジョブをキューに追加しています。

このキューを使用して、ジョブを順番に処理することができます。

このコードを実行すると、まずjobQueueという名前の新しいキューが作成されます。

その後、3つのジョブがキューに追加されます。これらのジョブはキューの末尾に追加されるため、最初に追加されたジョブから順に処理することができます。

○サンプルコード6:キューを使ったネットワーク通信のシミュレーション

ネットワーク通信のシミュレーションでは、データが一つのポイントから別のポイントへ順番に送信される様子を考えることができます。

この時、キューは非常に役立つデータ構造となります。

キューを使用することで、ネットワーク上でデータが送信される順番を正確に保持することができます。

このコードでは、TypeScriptを使ってキューを実装し、そのキューを用いてネットワーク通信のシミュレーションを行います。

// キューのクラス定義
class Queue<T> {
    private items: T[] = [];

    enqueue(element: T) {
        this.items.push(element);
    }

    dequeue(): T | undefined {
        return this.items.shift();
    }

    isEmpty(): boolean {
        return this.items.length == 0;
    }
}

// ネットワーク通信のシミュレーション
class NetworkSimulation {
    private queue: Queue<string> = new Queue();

    // データをキューに追加
    send(data: string) {
        this.queue.enqueue(data);
        console.log(`${data}を送信キューに追加しました。`);
    }

    // キューからデータを取得して送信
    transmit() {
        while (!this.queue.isEmpty()) {
            const data = this.queue.dequeue();
            console.log(`${data}を送信しました。`);
        }
    }
}

const simulation = new NetworkSimulation();
simulation.send("データ1");
simulation.send("データ2");
simulation.send("データ3");
simulation.transmit();

このコードでは、まずキューを表すQueueクラスを定義しています。

その後、NetworkSimulationクラスでは、キューを使用してデータの送信をシミュレートします。

NetworkSimulationsendメソッドを使用すると、データを送信キューに追加することができます。

一方、transmitメソッドでは、キューからデータを取得して、それを送信している様子をシミュレートしています。

このコードを実行すると、次のような結果を得られます。

まず、3つのデータが送信キューに追加されます。

その後、キューが空になるまでデータが順番に送信されます。

データ1を送信キューに追加しました。
データ2を送信キューに追加しました。
データ3を送信キューに追加しました。
データ1を送信しました。
データ2を送信しました。
データ3を送信しました。

このシミュレーションは、実際のネットワーク環境でのデータの送受信を模倣するものではありませんが、キューの動作原理や、データがどのように順番に処理されるのかを理解するのに役立ちます。

●TypeScriptでのキューの操作方法

キューは、先入れ先出し(FIFO)という原則に基づいてデータを管理するデータ構造です。

具体的には、データがキューの末尾に追加され、先頭から順に取り出されます。

TypeScriptでキューを操作するための基本的な方法を、以下のサンプルコードを通じて解説いたします。

○サンプルコード7:キューからのデータの取得

まず、TypeScriptを使用してキューを実装し、データの取得を行うサンプルコードを紹介します。

class Queue<T> {
  private items: T[] = [];

  enqueue(element: T) {
    this.items.push(element);
  }

  dequeue(): T | undefined {
    return this.items.shift();
  }

  peek(): T | undefined {
    return this.items[0];
  }
}

const queue = new Queue<number>();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
const firstItem = queue.dequeue();

このコードでは、Queueクラスを使ってキューを実装しています。

Tはジェネリクスを使用しており、これにより任意の型でキューを作成することができます。

enqueueメソッドではキューの末尾にデータを追加しており、dequeueメソッドではキューの先頭からデータを取り出しています。

このコードを実行すると、firstItemには1が格納されます。

なぜなら、1は最初にenqueueされ、最初にdequeueされるからです。

○サンプルコード8:キューの先頭データの確認

キューは「First In, First Out」(FIFO)という原則に基づいて動作するデータ構造です。

これは、最初に追加されたデータが最初に取り出されることを意味します。

キューで重要な操作の1つに、先頭のデータを確認することがあります。

この操作は、キューからデータを削除することなく、現在の先頭データを参照したい場面で役立ちます。

ここでは、TypeScriptを用いてキューの先頭のデータを確認する方法について、詳しく解説します。

まず、キューの基本的な実装を思い出してみましょう。

キューは通常、配列やリストを用いて実装されます。

TypeScriptでは、ジェネリックを用いてキューの型を柔軟に定義することができます。

class Queue<T> {
    private items: T[] = [];

    enqueue(element: T) {
        this.items.push(element);
    }

    dequeue(): T | undefined {
        return this.items.shift();
    }

    // キューの先頭データの確認
    peek(): T | undefined {
        return this.items[0];
    }
}

このコードでは、QueueクラスをジェネリックTを用いて定義しています。

enqueueメソッドとdequeueメソッドは、それぞれキューにデータを追加し、先頭のデータを取り出すためのメソッドです。

そして、peekメソッドが今回の主役であり、キューの先頭のデータを返す役割を持ちます。

このコードを実行すると、キューの先頭データを確認することができます。

たとえば、次のようなコードでpeekメソッドを使用することができます。

const numberQueue = new Queue<number>();
numberQueue.enqueue(1);
numberQueue.enqueue(2);
numberQueue.enqueue(3);

console.log(numberQueue.peek());  // 1が出力される

このコードの中で、numberQueueというキューに1, 2, 3の順番でデータを追加しています。

その後、peekメソッドを用いて先頭のデータを確認すると、1が出力されます。

○サンプルコード8:キューの先頭データの確認

キューは「First In, First Out」(FIFO)という原則に基づいて動作するデータ構造です。

これは、最初に追加されたデータが最初に取り出されることを意味します。

キューで重要な操作の1つに、先頭のデータを確認することがあります。

この操作は、キューからデータを削除することなく、現在の先頭データを参照したい場面で役立ちます。

ここでは、TypeScriptを用いてキューの先頭のデータを確認する方法について、詳しく解説します。

まず、キューの基本的な実装を思い出してみましょう。キューは通常、配列やリストを用いて実装されます。

TypeScriptでは、ジェネリックを用いてキューの型を柔軟に定義することができます。

class Queue<T> {
    private items: T[] = [];

    enqueue(element: T) {
        this.items.push(element);
    }

    dequeue(): T | undefined {
        return this.items.shift();
    }

    // キューの先頭データの確認
    peek(): T | undefined {
        return this.items[0];
    }
}

このコードでは、QueueクラスをジェネリックTを用いて定義しています。

enqueueメソッドとdequeueメソッドは、それぞれキューにデータを追加し、先頭のデータを取り出すためのメソッドです。

そして、peekメソッドが今回の主役であり、キューの先頭のデータを返す役割を持ちます。

このコードを実行すると、キューの先頭データを確認することができます。

たとえば、次のようなコードでpeekメソッドを使用することができます。

const numberQueue = new Queue<number>();
numberQueue.enqueue(1);
numberQueue.enqueue(2);
numberQueue.enqueue(3);

console.log(numberQueue.peek());  // 1が出力される

このコードの中で、numberQueueというキューに1, 2, 3の順番でデータを追加しています。

その後、peekメソッドを用いて先頭のデータを確認すると、1が出力されます。

○サンプルコード9:キューが空かどうかの確認

キューはデータの入出力に使われる非常に便利なデータ構造です。

そして、データを取り出す前に、キューにデータが存在するかどうかを確認する必要があります。

キューが空の場合、データの取り出し操作は失敗するため、その前にキューが空かどうかを確認するメソッドは非常に重要です。

では、TypeScriptを使ってキューが空かどうかを確認するサンプルコードを見てみましょう。

class Queue<T> {
    private items: T[] = [];

    // ... その他のメソッド ...

    // キューが空かどうかを確認するメソッド
    isEmpty(): boolean {
        return this.items.length === 0;
    }
}

const numberQueue = new Queue<number>();
console.log(numberQueue.isEmpty());  // true
numberQueue.enqueue(5);
console.log(numberQueue.isEmpty());  // false

このコードでは、Queueというジェネリクスを利用したキュークラスを実装しています。

その中にisEmptyというメソッドを追加し、キューが空かどうかを確認しています。

このメソッドは、内部の配列itemsの長さが0かどうかでキューが空かどうかを判断しています。

numberQueueというキューのインスタンスを作成し、初めにisEmptyメソッドでキューが空かどうかを確認すると、trueと表示されます。

その後、5をキューに追加して再度isEmptyメソッドでキューが空かどうかを確認すると、falseと表示されることが確認できます。

この方法を使用することで、データを取り出す前や、何かの処理を行う前にキューの状態を確認することができます。

特に、実際のアプリケーション開発時や大規模なシステム開発時に、キューが空かどうかの確認は避けて通れないステップとなるでしょう。

また、TypeScriptのジェネリクスを使用することで、任意のデータ型に対応したキューを作成することができます。

この特徴を活かし、さまざまなデータ型のキューを柔軟に実装することが可能です。

最後に、このコードを実行すると、キューを作成した直後のisEmptyの確認結果はtrueとなります。

しかし、データを追加した後の確認結果はfalseとなります。

このように、キューの状態をリアルタイムで確認することができるのは非常に便利ですね。

●注意点と対処法

キューの操作や実装に関して、TypeScriptでの特有の注意点や対処法を2つのサブセクションで解説します。

○TypeScriptでの型安全なキューの取り扱い

TypeScriptは、JavaScriptに静的型付けの特性を追加するための言語です。

これにより、コードのバグを早期に検出したり、より理解しやすいコードを記述することが可能になります。

しかし、この型システムはキューのようなデータ構造を扱う際にも注意が必要です。

例えば、キュー内に異なる型のデータを混在させることは避けるべきです。

そうすることで、データの取り出し時に予期しない型のデータが返されるリスクが生まれます。

このような状況を避けるために、TypeScriptのジェネリクスを活用して、キューの型を指定することができます。

TypeScriptのジェネリクスを用いて型安全なキューを実装するサンプルコードを紹介します。

class Queue<T> {
    private items: T[] = [];

    enqueue(element: T): void {
        this.items.push(element);
    }

    dequeue(): T | undefined {
        return this.items.shift();
    }
}

このコードでは、Queueクラスにジェネリクス<T>を使っています。

これにより、Queue<number>のようにして数値のみを扱うキューを作成することができます。

また、Queue<string>のようにして文字列のみを扱うキューも作成できます。

このコードを実行すると、型Tに基づいてキューが動作します。

例えば、Queue<number>のインスタンスに文字列を追加しようとすると、コンパイルエラーが発生します。

○パフォーマンス上の注意点と最適化

キューの実装や操作においては、パフォーマンスも重要な考慮点となります。

特に、大量のデータを扱う場合や、高頻度でのenqueueとdequeue操作が求められるシチュエーションでは、効率的な実装が不可欠です。

例として、上記の基本的なキューの実装では、dequeue操作は配列の先頭要素を削除するためのshiftメソッドを使用しています。

しかし、このshiftメソッドは、大きな配列では効率が良くありません。

これは、先頭要素の削除に伴い、残りの全ての要素が移動する必要があるためです。

このような問題を解消するためには、リングバッファやダブルエンドキューのようなデータ構造を使用することで、効率的なdequeue操作を実現することが可能です。

また、キューのサイズが増え続ける場合、メモリのオーバーヘッドが問題となる可能性もあります。

このような状況では、キューの容量をあらかじめ制限するなど、適切な対策を講じる必要があります。

●カスタマイズ方法

TypeScriptを使ったキューの実装・操作では、必要に応じてキューの動作をカスタマイズすることが可能です。

今回は、キューの基本的な動作をカスタマイズした例として、特定の条件に合わせてデータを挿入するカスタムキューの作成方法を解説します。

○サンプルコード10:カスタムキューの作成例

まず、基本的なキューのクラスを作成します。

この基本クラスに、カスタムメソッドを追加してカスタマイズを行います。

class Queue<T> {
    private items: T[] = [];

    // キューの末尾に要素を追加
    enqueue(element: T): void {
        this.items.push(element);
    }

    // キューの先頭から要素を削除
    dequeue(): T | undefined {
        return this.items.shift();
    }

    // キューのサイズを取得
    size(): number {
        return this.items.length;
    }
}

// カスタムキューのクラス
class CustomQueue<T> extends Queue<T> {
    // 特定の条件で要素を追加
    customEnqueue(element: T, condition: (element: T) => boolean): void {
        if (condition(element)) {
            this.enqueue(element);
        }
    }
}

このコードでは、まずQueueというキューの基本クラスを定義しています。

その後、この基本クラスを拡張したCustomQueueクラスを作成し、新たなメソッドcustomEnqueueを追加しています。

customEnqueueメソッドは、引数として要素と条件を表す関数を受け取り、この条件が満たされた場合にのみキューに要素を追加します。

例えば、次のように使用することで、偶数のみをキューに追加するカスタマイズが可能です。

const queue = new CustomQueue<number>();

queue.customEnqueue(5, (num) => num % 2 === 0); // 5は追加されない
queue.customEnqueue(6, (num) => num % 2 === 0); // 6は追加される

console.log(queue.size()); // 出力:1

このコードを実行すると、キューには偶数の6のみが追加され、sizeメソッドでキューのサイズを確認すると1となることを確認できます。

まとめ

TypeScriptを使ってキューを学ぶ際の方法や実装を10のサンプルコードを通じて詳細に解説しました。

キューはプログラミングの中でも基本的なデータ構造の一つで、その動作や実装方法は非常に重要です。

この記事では、基本的なキューの実装から、応用例、操作方法、注意点、カスタマイズ方法に至るまでを網羅的に説明しました。

特にTypeScriptを用いることで、型安全なキューの実装や取り扱い方についての知識も得ることができます。

さらに、パフォーマンスや最適化のポイントについても触れましたので、実際のプロジェクトでのキューの利用時に役立つ情報を多く紹介しています。

初心者から経験者まで、TypeScriptでのキュー実装・操作に関する知識を深めたい方は、この記事のサンプルコードを手を動かしながら試すことで、より理解を深めることができるでしょう。

また、キュー以外のデータ構造やアルゴリズムに関しても、同様のアプローチで学ぶことをおすすめします。

プログラミングやデータ構造の学習は継続が鍵です。

今回学んだ知識を生かして、さらなる実践や深化を目指してください。