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

C言語でキューに要素を挿入する方法を徹底解説!基本概念からサンプルコードまで

データ構造とは、データを体系的かつ効率的に整理・格納するための仕組みです。データ構造は、その構成方法によって大きく以下の2種類に分類できます。

  • 線形データ構造 − データが一直線上に順序立てて配置される構造です。例として、配列、構造体、スタック、キュー、連結リストなどが挙げられます。
  • 非線形データ構造 − データが階層的・網目的に配置される構造です。例として、木(ツリー)、グラフ、集合、テーブルなどが挙げられます。

キュー(Queue)とは

キューは線形データ構造の一つで、後端(リア/rear)から要素を挿入し、前端(フロント/front)から要素を削除するという特徴を持っています。

キューにおけるデータの処理順序はFIFO(First In First Out:先入れ先出し)と呼ばれます。これは、最初に挿入された要素が最初に取り出されることを意味します。日常的な例では、レジや窓口に並ぶ行列がイメージしやすいでしょう。

キューの基本操作

  • 挿入(Insert / Enqueue) − キューの後端に新しい要素を追加します。
  • 削除(Delete / Dequeue) − キューの前端から要素を取り除きます。

キューの状態に関する条件

  • キューオーバーフロー(Queue Overflow) − すでに満杯のキューに対して、さらに要素を挿入しようとしたときに発生するエラー状態です。
  • キューアンダーフロー(Queue Underflow) − 空のキューから要素を削除しようとしたときに発生するエラー状態です。

挿入操作のアルゴリズム

キューへの要素挿入を行う insert( ) 関数の基本的なアルゴリズムは以下の通りです。

まず、キューが満杯かどうか(オーバーフロー)をチェックします。

if (r == n)
    printf("Queue overflow")

オーバーフローでなければ、後端の位置に要素を格納し、リアポインタを1つ進めます。

q[r] = item
r++

C言語によるキュー挿入プログラム

以下は、C言語でキューに要素を挿入する完全なサンプルプログラムです。メニュー形式で「要素の挿入」「キュー内容の表示」「終了」を選択できる構成になっています。

#include <stdio.h>
#define MAX 50
void insert();
int array[MAX];
int rear = - 1;
int front = - 1;
main(){
    int add_item;
    int choice;
    while (1){
        printf("1.Insert element to queue \n");
        printf("2.Display elements of queue \n");
        printf("3.Quit \n");
        printf("Enter your choice : ");
        scanf("%d", &choice);
        switch (choice){
            case 1:
                insert();
            break;
            case 2:
                display();
            break;
            case 3:
                exit(1);
            default:
            printf("Wrong choice \n");
        }
    }
}
void insert(){
    int add_item;
    if (rear == MAX - 1)
        printf("Queue Overflow \n");
    else{
        if (front == - 1)
            /*If queue is initially empty */
            front = 0;
            printf("Inset the element in queue : ");
            scanf("%d", &add_item);
            rear = rear + 1;
            array[rear] = add_item;
        }
}
void display(){
    int i;
    if (front == - 1)
        printf("Queue is empty \n");
    else{
        printf("Queue is : \n");
        for (i = front; i <= rear; i++)
            printf("%d ", array[i]);
        printf("\n");
    }
}

実行結果

上記のプログラムを実行すると、以下のような出力が得られます。要素「34」と「24」を順番に挿入した後、キューの内容を表示すると、先に入れた「34」が先頭に並んでいることが確認できます。これこそがFIFO(先入れ先出し)の動作です。

1.Insert element to queue
2.Display elements of queue
3.Quit
Enter your choice: 1
Inset the element in queue: 34
1.Insert element to queue
2.Display elements of queue
3.Quit
Enter your choice: 1
Inset the element in queue: 24
1.Insert element to queue
2.Display elements of queue
3.Quit
Enter your choice: 2
Queue is:
34 24
1.Insert element to queue
2.Display elements of queue
3.Quit
Enter your choice: 3

まとめ

この記事では、C言語におけるキューへの要素挿入について解説しました。キューはFIFO方式を採用した線形データ構造であり、挿入は後端から、削除は前端から行われます。実装時には、オーバーフロー(満杯チェック)とアンダーフロー(空チェック)の2つの条件を適切にハンドリングすることが重要です。配列ベースのシンプルな実装を通じて、キューの基本動作をしっかりと理解しておきましょう。

  1. C言語のシフト演算とは?左シフト・右シフト・補数の基本をわかりやすく解説

    問題 C言語を使用して、ある数値に対する左シフト・右シフト・補数(ビット反転)を求める簡単なプログラムを作成するには、どのようにすればよいのでしょうか。 解決方法 左シフト(<<) 変数の値を1ビットだけ左へシフトすると、その値は2倍になります。「a × 2」を計算したのと同じ結果です。 例:a = 10 の場合、a << 1 = 20 右シフト(>>) 変数の値を1ビットだけ右へシフトすると、その値は元の半分になります。「a ÷ 2」の整数除算と同じ結果です。 例:a = 10 の場合、a >> 1 = 5 サンプルプログラム 以下は、シ

  2. C言語の探索アルゴリズム解説|線形探索と二分探索の違いと実装例

    探索(サーチ)とは、複数の要素で構成されるリストの中から、目的の「キー」となる要素を見つけ出す処理のことです。 リストの中に指定した要素が存在すれば、その探索は「成功」とみなされます。 指定した要素がリストに存在しなければ、その探索は「失敗(不成功)」となります。 C言語で広く使われている代表的な探索手法は、主に次の2つです。 線形探索(Linear Search/リニアサーチ) 二分探索(Binary Search/バイナリサーチ) 線形探索(Linear Search)とは 線形探索は、リストの先頭から順に要素を1つずつ取り出し、キーと一致するかどうかを確認していく、最も基本的な探