Cの循環キュー:実装方法は?

公開: 2020-10-23

データは、最後の要素が最初の要素に接続されている循環パターンで循環キューに配置されます。 タスクがFIFO(先入れ先出し)で実行される線形キューとは異なり、タスク実行の循環キューの順序は変更される場合があります。 挿入および削除操作は、任意の位置で実行できます。

循環キューは線形キューよりも効率的です。 循環キューのグラフィック表現では、前部と後部の位置が接続されており、操作が常にFIFOベースで実行される円になっていることがわかります。 すべての新しい要素はリアエンドで追加され、フロントエンドから削除されます。 循環キューの使用率は高く、時間計算量はO(1)です。

ソース

目次

循環キューのアプリケーション

  • CPUスケジューリング:循環キューは、線形キューにある空のメモリスペースを利用します。
  • 交通システム:交通システムでは、循環キューの助けを借りて、信号機は設定された時間間隔で操作されます。
  • メモリ管理:オペレーティングシステムは、実行の準備ができているプロセス、または特定のイベントの発生を待機している一連のプロセスを頻繁に維持します。

学ぶ:バブルソートのためのCプログラム:Cでのバブルソート

説明付きのサンプルコード

1行目://(1)プリプロセッサ

2行目://キュー制限を5要素に設定

3行目:#include <stdio.h>

4行目:#define LIM 5

5行目://(2)キューのデータ型宣言

6行目://データはデータを保持します; delPos、削除する位置; 長さ、いいえ。

7行目://現在キューに存在する要素

8行目:typedef struct queue {

9行目:int data [LIM]、delPos、length;

10行目:} Q;

11行目://(3)グローバル宣言

12行目://構造体キュータイプの関数とグローバル変数q

13行目:Q q;

14行目:void ui_Q_Ops()、insertQel()、deleteQel()、displayQels()、initQ();

15行目://(4)初期化後にUI関数を呼び出す

16行目:int main()

17行目:{

18行目:initQ();

19行目:ui_Q_Ops();

20行目:0を返します。

21行目:}

22行目://(5)キューを初期化する

23行目:void initQ()

24行目:{

25行目:q.length = 0;

26行目:q.delPos = 0;

27行目:}

28行目://(6)メニュードリブンループは正しい関数を呼び出します

29行目:void ui_Q_Ops()

30行目:{

31行目:int choice = 0;

32行目:char input [16];

33行目:while(choice!= 4){

34行目:printf(” \ n ———————- \ n“);

35行目:printf(”1.キューに挿入\n“);

36行目:printf(”2.キューから削除\n“);

37行目:printf(”3.キューアイテムを表示します\n“);

38行目:printf(”4.プログラムを終了します\n“);

39行目:printf(”選択肢を入力:“);

40行目:if(fgets(input、15、stdin)!= NULL){

41行目:if(sscanf(input、“%d”、&choice)== 1){

42行目:switch(choice){

43行目:ケース1:insertQel();

44行目:ブレーク;

45行目:ケース2:deleteQel();

46行目:ブレーク;

47行目:ケース3:displayQels();

48行目:ブレーク;

49行目:ケース4:戻る;

50行目:デフォルト:printf("無効な選択\n");

51行目:続行します。

52行目:}

53行目:} else

54行目:printf("無効な選択\n");

55行目:}

56行目:}

57行目:}

58行目://(7)キューに挿入

59行目://長さがMAX Limitと同じ場合、キューはいっぱいです。それ以外の場合は挿入します。

60行目://MAX制限による合計長とdelPos係数で循環的に達成

61行目://および増分長

62行目:void insertQel()

63行目:{

64行目:int el、inspos;

65行目:char input [16];

66行目:if(q.length == LIM){

67行目:printf("キューがいっぱいです\n");

68行目:戻る;

69行目:}

70行目:inspos =(q.delPos + q.length)%LIM;

71行目:printf(”挿入する要素を入力してください:“);

72行目:if(fgets(input、15、stdin)!= NULL){

73行目:if(sscanf(input、“%d”、&el)){

74行目:q.data [inspos] = el;

75行目:q.length ++;

76行目:} else

77行目:printf("無効な入力\n");

78行目:}

79行目:}

80行目://(8)キューから削除

81行目://長さが0の場合、キューは空です。それ以外の場合は、delPosで削除します。

82行目://およびデクリメント長

83行目:void deleteQel()

84行目:{

85行目:if(q.length == 0){

86行目:printf("キューが空です\n");

87行目:} else {

88行目:printf( "削除された要素%d \ n"、q.data [q.delPos]);

89行目:q.delPos =(q.delPos + 1)%LIM;

90行目:q.length–;

91行目:}

92行目:}

93行目://(9)キュー要素を表示

94行目://delPosで始まるループを実行して循環的に表示します

95行目://最大制限によるイテレータとモジュラスの追加

96行目:void displayQels()

97行目:{

98行目:int i;

99行目:if(q.length == 0){

100行目:printf("キューが空です\n");

101行目:} else {

行102:printf(”キューの要素は次のとおりです:“);

103行目:for(i = 0; i <q.length; i ++){

104行目:printf( "%d"、q.data [(q.delPos + i)%LIM]);

105行目:}

106行目:printf(” \ n“);

107行目:}

108行目:}

109行目:

出力:

循環キューでの操作

1. insertQel()–要素を循環キューに挿入します

循環キューでは、enQueue()関数を使用して要素を循環キューに挿入します。 循環キューでは、新しい機能は常に後部の位置に挿入されます。 enQueue()関数は、1つの整数値をパラメーターとして受け取り、それを循環キューに挿入します。 次の手順は、要素を循環キューに挿入するために実装されています。

ステップ1-長さがMAXLimitと同じかどうかを確認します。 trueの場合、キューがいっぱいであることを意味します。 満杯の場合は、「キューが満杯です」と表示し、機能を終了します。

ステップ2– FULLでない場合は、合計長とdelPosモジュラスをMAXLimitと増分長で循環的に達成する値を挿入します。

2. deleteQel()–循環キューから要素を削除します

循環キューでは、deQueue()は循環キューから要素を削除するために使用される関数です。 循環キューでは、要素は常に最前面から削除されます。 deQueue()関数は、パラメーターとして値を取りません。 循環キューから要素を削除するには、次の手順を実行します…

ステップ1-キューが空かどうかを確認します。 (フロント== -1&&リア==-1)

ステップ2–空の場合は、「キューが空です」と表示して、機能を終了します。

ステップ3–空でない場合は、位置に従って削除された要素を表示します。 すべての要素が追加されたら、次の位置modキュー制限に移動します。

3. displayQels()–循環キューに存在するキュー要素を表示します。 循環キューの要素を表示するために、次の手順が実装されています。

ステップ1-キューが空かどうかを確認します。

ステップ2–長さが0の場合は空で、「キューが空です」と表示して機能を終了します。

ステップ3–空でない場合は、整数変数「i」を定義します。

ステップ4–iを0に設定します。

ステップ5–繰り返しますが、位置と増分値に従って要素を1つ表示します(i ++)。 'i<q.length'がFALSEになるまで同じことを繰り返します。

循環キューは、リンクリストを使用して実装することもできます。 アルゴリズムは次のとおりです。

  • エンキューのアルゴリズム:

if(FRONT == NULL)//空のキューに挿入する

FRONT = REAR = newNode

終了する場合

そうしないと

REAR-> next =newNode//最後の要素の後に挿入

REAR = newNode

他の終わり

リア->次=フロント

エンキューを終了

  • デキューのアルゴリズム:

if(FRONT == NULL)//アンダーフローの条件

「キューアンダーフロー」を印刷

デキューを終了します

終了する場合

else if(FRONT == REAR)//キューにはノードが1つだけ含まれています

temp=FRONT->データ

free(temp)

FRONT=FRONT->次へ

リア->次=フロント

終了する場合

else if(FRONT == N – 1)//FRONTが最後のノードの場合

front =0//最初のノードとしてFRONTを作成します

終了する場合

デキューを終了します

また読む: Python対C:完全なサイドバイサイド比較

結論

データ構造とアルゴリズムは、Cプログラミングだけでなく、他の言語でも非常に重要です。 その価値は前例のないものであり、そのような重要なトピックについては、専門家によって設計および指導されたコースに投資することをお勧めします。これにより、ポートフォリオに優れた付加価値がもたらされます。 upGradは、スキルを向上させるだけでなく、基本の強力な柱を構築する、パワー満載のコースを幅広く提供しています。

評判の高いIIIT-Bによって設計されており、高品質のコンテンツを提供するだけでなく、同じキャリアパスで進化している人々や業界の専門家とつながる強力なネットワークの一部になります。あなたの疑問を解決し、毎回あなたをサポートします。

彼らの考え方や思考プロセスを知ることはあなたを助けるでしょう。 そして、upGradで得られるユニークな点の1つは、EMIオプションを選択して、ポケットに入れやすいことです。

これらのCプロジェクトを実行する上で素晴らしい学習の機会があることを願っています。 詳細に興味があり、業界の専門家からの指導が必要な場合は、フルスタックソフトウェア開発におけるupGrad&IIITBangloreのPGディプロマを確認してください。

未来のキャリアに備える

フルスタックソフトウェア開発におけるアップグレードおよびIIIT-BANGALOREのPGディプロマ
今すぐ申し込む