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

C++で配列を使ってキューを実装する方法|完全なコード例と詳しい解説

キューとは?FIFO方式の基本

キュー(Queue)とは、複数の要素を格納する抽象的なデータ構造です。キューはFIFO(First In First Out:先入れ先出し)方式を採用しており、最初に挿入された要素が最初に取り出されます。言い換えれば、最も古く追加された要素から順に削除されていくのがキューの大きな特徴です。日常の行列(待ち列)と同じ動きをするイメージを持つと分かりやすいでしょう。

ここでは、配列を使用してキューを実装するC++プログラムを紹介します。

C++によるキュー実装の完全なコード例

次のプログラムは、配列をベースにキューの「挿入」「削除」「表示」を行うメニュー形式のコンソールアプリケーションです。

#include <iostream>
using namespace std;

int queue[100], n = 100, front = -1, rear = -1;

void Insert() {
    int val;
    if (rear == n - 1)
        cout << "Queue Overflow" << endl;
    else {
        if (front == -1)
            front = 0;
        cout << "Insert the element in queue : " << endl;
        cin >> val;
        rear++;
        queue[rear] = val;
    }
}

void Delete() {
    if (front == -1 || front > rear) {
        cout << "Queue Underflow ";
        return;
    } else {
        cout << "Element deleted from queue is : " << queue[front] << endl;
        front++;
    }
}

void Display() {
    if (front == -1)
        cout << "Queue is empty" << endl;
    else {
        cout << "Queue elements are : ";
        for (int i = front; i <= rear; i++)
            cout << queue[i] << " ";
        cout << endl;
    }
}

int main() {
    int ch;
    cout << "1) Insert element to queue" << endl;
    cout << "2) Delete element from queue" << endl;
    cout << "3) Display all the elements of queue" << endl;
    cout << "4) Exit" << endl;
    do {
        cout << "Enter your choice : " << endl;
        cin >> ch;
        switch (ch) {
            case 1: Insert();
            break;
            case 2: Delete();
            break;
            case 3: Display();
            break;
            case 4: cout << "Exit" << endl;
            break;
            default: cout << "Invalid choice" << endl;
        }
    } while (ch != 4);
    return 0;
}

実行結果の出力例

上記プログラムを実際に実行すると、次のような出力が得られます。

1) Insert element to queue
2) Delete element from queue
3) Display all the elements of queue
4) Exit
Enter your choice : 1
Insert the element in queue : 4
Enter your choice : 1
Insert the element in queue : 3
Enter your choice : 1
Insert the element in queue : 5
Enter your choice : 2
Element deleted from queue is : 4
Enter your choice : 3
Queue elements are : 3 5
Enter your choice : 7
Invalid choice
Enter your choice : 4
Exit

出力を見ると、最初に入力した「4」が最初に削除されていることが確認でき、FIFO(先入れ先出し)の動作が正しく実現できています。

プログラムの各部分を詳しく解説

Insert() 関数:要素の挿入

上記プログラムでは、Insert() 関数がキューへ要素を挿入します。まず rear(末尾ポインタ)が n - 1 と等しい場合はキューが満杯であるため、「Queue Overflow(オーバーフロー)」を表示します。front(先頭ポインタ)が -1 のときは、先頭位置を 0 に設定したうえで、rear を 1 つ進め、そのインデックスへ新しい要素を格納します。該当するコードは以下の通りです。

void Insert() {
    int val;
    if (rear == n - 1)
        cout << "Queue Overflow" << endl;
    else {
        if (front == -1)
            front = 0;
        cout << "Insert the element in queue : " << endl;
        cin >> val;
        rear++;
        queue[rear] = val;
    }
}

Delete() 関数:要素の削除

Delete() 関数では、キューに要素がひとつもない場合(front == -1 または front > rear)はアンダーフロー状態として「Queue Underflow」を表示して処理を終了します。それ以外の場合は、front の位置にある要素を画面に表示し、front を 1 つ進めることで削除を表現しています。

void Delete() {
    if (front == -1 || front > rear) {
        cout << "Queue Underflow ";
        return;
    }
    else {
        cout << "Element deleted from queue is : " << queue[front] << endl;
        front++;
    }
}

Display() 関数:キューの内容を一覧表示

Display() 関数では、front が -1 の場合はキューが空であることを示すメッセージを出力します。それ以外の場合は、for ループを使って front から rear までのすべてのキュー要素を順番に表示します。

void Display() {
    if (front == -1)
        cout << "Queue is empty" << endl;
    else {
        cout << "Queue elements are : ";
        for (int i = front; i <= rear; i++)
            cout << queue[i] << " ";
        cout << endl;
    }
}

main() 関数:メニューによる操作選択

main() 関数は、ユーザーに対して「挿入」「削除」「表示」「終了」のいずれかを選択させるメニューを提供します。ユーザーの入力に応じて switch 文で適切な関数を呼び出し、無効な値が入力された場合にはその旨を出力します。do-while ループにより、ユーザーが「4(終了)」を選択するまで処理が繰り返されます。

int main() {
    int ch;
    cout << "1) Insert element to queue" << endl;
    cout << "2) Delete element from queue" << endl;
    cout << "3) Display all the elements of queue" << endl;
    cout << "4) Exit" << endl;
    do {
        cout << "Enter your choice : " << endl;
        cin >> ch;
        switch (ch) {
            case 1: Insert();
            break;
            case 2: Delete();
            break;
            case 3: Display();
            break;
            case 4: cout << "Exit" << endl;
            break;
            default: cout << "Invalid choice" << endl;
        }
    } while (ch != 4);
    return 0;
}

まとめ:配列ベースのキュー実装のポイント

この記事で紹介したように、配列と frontrear という2つのインデックス変数を組み合わせることで、シンプルなキュー構造を簡単に実装できます。オーバーフローとアンダーフローの判定を適切に行うことが、堅牢なキュー実装の重要なポイントです。

なお、今回のような線形配列による実装では、削除後の先頭側に空きができても再利用できないという制約があります。より実践的に使いたい場合は、循環キュー(リングバッファ)や標準ライブラリの std::queue を活用することをおすすめします。

  1. 配列を使ってC++でスタックを実装する方法【サンプルコード付きで解説】

    スタック(Stack)は、要素の集合を管理するための抽象データ構造の一つです。最大の特徴はLIFO(Last In, First Out:後入れ先出し)方式を採用している点で、最後に追加された要素ほど最初に取り出されます。本記事では、C++の配列を使ってスタックを実装する方法を、完全なサンプルコードとともにわかりやすく解説します。スタックの主な操作スタックに対して行える基本的な操作には、次の3つがあります。Push(プッシュ) … スタックの頂上(トップ)に新しいデータを追加するPop(ポップ) … スタックのトップからデータを取り除くPeek(ピーク) … スタックのトップにあるデータを参照

  2. C++でソート済み配列を実装するプログラム:選択ソートの基本と実装例

    ソート済み配列とは、数値順やアルファベット順など、何らかの基準に従ってすべての要素が整列された配列のことです。配列をソートするためのアルゴリズムには、バブルソート、挿入ソート、選択ソート、マージソート、クイックソート、ヒープソートなど、さまざまな種類があります。本記事では、その中でも「選択ソート」を使って配列をソートする方法について、サンプルコードを交えながら詳しく解説します。選択ソートとは選択ソートは、未ソート部分の中から最小の要素を繰り返し見つけ出し、それを未ソート部分の先頭にある要素と入れ替えることで、徐々にソート済み配列を作り上げていく手法です。実装がシンプルで理解しやすいことが特徴で