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

C言語でキューから要素を削除する方法を解説!基本概念から実装・実行結果まで

データ構造とは、データを構造化された方法で整理・管理する仕組みのことです。データ構造は、大きく次の2種類に分けられます。

  • 線形データ構造 − データが一列(線形)に並ぶ形で整理されます。例:配列、構造体、スタック、キュー、連結リスト

  • 非線形データ構造 − データが階層的に整理されます。例:木、グラフ、集合、テーブル

キュー(Queue)とは

キューは線形データ構造の一種で、要素の挿入(追加)は後端(rear)から行い、削除(取り出し)は前端(front)から行います。

キューの処理順序は FIFO(First In First Out:先入れ先出し) です。最初に入れた要素が最初に取り出されるのが最大の特徴です。

キューの主な操作

  • 挿入(Insert) − キューに要素を追加する
  • 削除(Delete) − キューから要素を取り除く

キューの状態条件

  • オーバーフロー(Overflow) − 満杯のキューにさらに要素を挿入しようとする状態

  • アンダーフロー(Underflow) − 空のキューから要素を削除しようとする状態

キューのアルゴリズム

挿入(insert)のアルゴリズム

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

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

満杯でなければ、キューに要素を挿入します。

q[r] = item;
r++;

削除(delete)のアルゴリズム

まず、キューが空かどうか(アンダーフローのチェック)を確認します。

if (f == r)
    printf("Queue underflow");

空でなければ、キューから要素を削除します。

item = q[f];
f++;

表示(display)のアルゴリズム

まず、キューが空かどうかを確認します。

if (f == r)
    printf("Queue is empty");

空でなければ、先頭「f」から末尾「r」までのすべての要素を表示します。

for (i = f; i < r; i++)
    printf("%d", q[i]);

C言語プログラム

以下は、キューから要素を削除する動作を確認できるC言語プログラムの例です。メニュー形式で、挿入・削除・表示・終了の操作を選択できるようになっています。

#include <stdio.h>
#include <stdlib.h>
#define MAX 50

void insert();
void delete();
void display();

int array[MAX];
int rear = -1;
int front = -1;

int main() {
    int choice;
    while (1) {
        printf("1.Insert element to queue \n");
        printf("2.Delete an element from queue\n");
        printf("3.Display elements of queue \n");
        printf("4.Quit \n");
        printf("Enter your choice : ");
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                insert();
                break;
            case 2:
                delete();
                break;
            case 3:
                display();
                break;
            case 4:
                exit(1);
            default:
                printf("Wrong choice \n");
        }
    }
    return 0;
}

void insert() {
    int add_item;
    if (rear == MAX - 1)
        printf("Queue Overflow \n");
    else {
        if (front == -1)
            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");
    }
}

void delete() {
    if (front == -1 || front > rear) {
        printf("Queue Underflow \n");
        return;
    } else {
        printf("Element deleted from queue is : %d\n", array[front]);
        front = front + 1;
    }
}

このプログラムでは、insert() が rear を進めながら配列の末尾へ要素を追加し、delete() が front の位置にある要素を取り出して front を1つ進めます。display() は front から rear までの全要素を順に表示します。また、削除前にキューが空かどうかを必ずチェックすることで、アンダーフローを防いでいます。

実行結果

上記のプログラムを実行すると、次のような結果が出力されます。先に入力した「12」が最初に削除されており、FIFO(先入れ先出し)の動作が確認できます。

1.Insert element to queue
2.Delete an element from queue
3.Display elements of queue
4.Quit
Enter your choice: 1
Inset the element in queue: 12
1.Insert element to queue
2.Delete an element from queue
3.Display elements of queue
4.Quit
Enter your choice: 1
Inset the element in queue: 23
1.Insert element to queue
2.Delete an element from queue
3.Display elements of queue
4.Quit
Enter your choice: 1
Inset the element in queue: 34
1.Insert element to queue
2.Delete an element from queue
3.Display elements of queue
4.Quit
Enter your choice: 2
Element deleted from queue is: 12
Queue is:
23 34
1.Insert element to queue
2.Delete an element from queue
3.Display elements of queue
4.Quit
Enter your choice: 2
Element deleted from queue is: 23
Queue is:
34
1.Insert element to queue
2.Delete an element from queue
3.Display elements of queue
4.Quit
Enter your choice: 4
  1. C言語のswitch文とは?基本構文・アルゴリズム・サンプルコードでわかりやすく解説

    switch文は、複数の選択肢の中から1つだけを実行したい場合に使われる条件分岐の制御構造です。switch文は、指定した式の値を整数定数や文字定数のリストと順番に照合していき、一致するcaseが見つかった時点で、そのcaseに紐づくステートメント(文)が実行されます。 switch文の基本構文 switch文の基本的な書き方は以下の通りです。 switch (式){    case 値1 : 文1;       break;    case 値2 : 文2;       break; &nbs

  2. 構造体の概念で理解するC言語のビットフィールド|定義方法と範囲の計算を徹底解説

    ビットフィールドとはビットフィールドとは、変数が占めるメモリのサイズをビット単位で指定できるC言語の機能です。通常は構造体(struct)の中で定義されます。ビットフィールドの基本:1バイト=8ビット記述例struct info { int x : 2; };この例では、メンバxは2ビットを占有します。ビットフィールド使用時の注意点ビットフィールドの範囲外の値を代入することはできません(その場合の動作は保証されません)。sizeof演算子やアドレス演算子(&)をビットフィールドに適用できないため、scanf関数で値を入力することもできません。ビットフィールドに指定できるデータ型