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 行:// struct queue 類型的函數和全局變量 q

第 13 行:Q q;

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

第 15 行:// (4) 初始化後調用 UI Function

第 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 選擇=0;

第 32 行:字符輸入[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 行:開關(選擇){

第 43 行:案例 1:insertQel();

第 44 行:中斷;

第 45 行:案例 2:deleteQel();

第 46 行:中斷;

第 47 行:案例 3:displayQels();

第 48 行:中斷;

第 49 行:案例 4:返回;

第 50 行:默認值:printf(“無效選擇\n”);

第 51 行:繼續;

第 52 行:}

第 53 行:} 其他

第 54 行: printf(" 無效選擇 \n");

第 55 行:}

第 56 行:}

第 57 行:}

第 58 行:// (7) 插入隊列

第 59 行://如果長度等於 MAX 限制,則隊列已滿,否則插入

第 60 行:// 通過 MAX Limit 以總長度和 delPos 模數循環實現

第 61 行:// 並增加長度

第 62 行:void insertQel()

第 63 行:{

第64行:int el,inspos;

第 65 行:字符輸入[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 行:} 其他

第 77 行: printf(" 無效輸入 \n ");

第 78 行:}

第 79 行:}

第 80 行:// (8) 從隊列中刪除

第 81 行:// 如果 Length 為 0,則隊列為空,否則在 delPos 處刪除

第 82 行:// 並減少長度

第 83 行:無效 deleteQel()

第 84 行:{

第 85 行:如果 (q.length == 0){

第86行:printf("隊列為空\n");

第 87 行:} 其他 {

第 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 行:// 並通過 Max Limit 添加迭代器和模數

第 96 行:無效 displayQels()

第 97 行:{

第 98 行:int i;

第 99 行:如果 (q.length == 0){

第 100 行:printf("隊列為空\n");

第 101 行:} 其他 {

第 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 步 – 檢查長度是否與 MAX Limit 相同。 如果為真,則表示隊列已滿。 如果是FULL,則顯示“Queue is full”並終止函數。

第 2 步 – 如果它不完整,則插入通過 MAX Limit 和增量長度通過總和長度和 delPos 模數循環實現的值

2. deleteQel() - 從循環隊列中刪除一個元素

在循環隊列中,deQueue() 是用於從循環隊列中刪除元素的函數。 在循環隊列中,元素總是從最前面的位置刪除。 deQueue() 函數不接受任何值作為參數。 執行以下步驟以從循環隊列中刪除元素……

步驟 1 – 檢查隊列是否為 EMPTY。 (前 == -1 && 後 == -1)

第 2 步 – 如果是 EMPTY,則顯示“Queue is empty”並終止函數。

第 3 步 – 如果不是空的,則根據位置顯示已刪除的元素。 添加每個元素後,移動到下一個位置 mod 隊列限制。

3. displayQels() – 顯示存在於循環隊列中的隊列元素。 執行以下步驟來顯示循環隊列的元素:

步驟 1 – 檢查隊列是否為 EMPTY。

步驟 2 – 如果長度為 0,則為 EMPTY,然後顯示“Queue is empty”並終止函數。

第 3 步 – 如果它不是 EMPTY,則定義一個整數變量“i”。

第 4 步 – 將 i 設置為 0。

第 5 步 – 同樣,根據位置和增量值顯示元素 (i++)。 重複相同的操作,直到 'i <q.length' 變為 FALSE。

循環隊列也可以使用鍊錶來實現。 以下是算法:

  • 入隊算法:

if (FRONT == NULL) // 插入空隊列

前=後=新節點

萬一

別的

REAR -> next = newNode // 在最後一個元素之後插入

後=新節點

以其他方式結束

後 -> 下一個 = 前

結束排隊

  • 出隊算法:

if(FRONT == NULL) // 下溢條件

打印“隊列下溢”

結束出隊

萬一

else if(FRONT == REAR) // 隊列只包含一個節點

溫度 = 前 -> 數據

免費(臨時)

前面 = 前面 -> 下一個

後 -> 下一個 = 前

萬一

else if (FRONT == N – 1) // 如果 FRONT 是最後一個節點

front = 0 // 將 FRONT 作為第一個節點

萬一

結束出隊

另請閱讀: Python 與 C:完整的並排比較

結論

數據結構和算法非常重要,不僅在 C 編程中,而且在其他語言中也是如此。 它的價值是前所未有的,對於如此重要的主題,最好投資於由專家設計和指導的課程,這將為您的投資組合提供極好的增值。 upGrad 提供範圍廣泛的功能豐富的課程,不僅可以提高您的技能,還可以建立強大的基礎知識支柱。

它由享有盛譽的 IIIT-B 設計,他們不僅提供優質的內容,而且使您成為強大網絡的一部分,您將與在同一職業道路上不斷發展的人以及行業專家建立聯繫每次都解決您的疑慮並支持您。

了解他們的心態和思維過程會對你有所幫助。 您在 upGrad 獲得的獨特之處之一是您可以選擇 EMI 選項並輕鬆負擔得起

我們希望您在執行這些 C 項目時有一個很好的學習機會。 如果您有興趣了解更多信息並需要行業專家的指導,請查看 upGrad & IIIT Banglore 的全棧軟件開發PG 文憑。

為未來的職業做準備

升級和 IIIT-BANGALORE 的 PG 文憑在全棧軟件開發中
現在申請