您好,登錄后才能下訂單哦!
這篇文章主要介紹如何使用c語言實現循環隊列,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
隊列是一種先入先出的結構,數據從隊列頭出,隊尾進。在linux內核中進程調度,打印緩沖區都有用到隊列。
隊列有多種實現方式,可以用鏈表,也可以用數組。這里用數組來實現一個簡單的循環隊列。首先創建一個大小為8的隊列如下,隊列頭尾指針指向同一塊內存,
當從隊列尾部插入一個數據后變成下面的情形,為了便于處理,這里始終會浪費一個空間
繼續插入數據,直到出現以下情形,表示隊列滿了,
接下來看一下出隊的情形,從隊列頭出隊3個元素,
再添加三個元素后隊列又變成滿的了,
在上面這種情況下面,如果再添加元素就會把隊列頭的元素覆蓋掉,如下:
循環隊列實現代碼:
#include <stdio.h> #include <stdlib.h> /* 循環隊列大小*/ #define MAX 8 typedef struct queue { int *que_array; int front; //指向隊首 int rear; //指向隊尾 int valid_cnt; //隊列中有效的數據個數 int total; //隊列總大小 } queue_t; typedef enum { E_NONE = 0, E_NOMEMORY = 1, E_FAIL = 2, } error_t; void init_queue(queue_t *que) { que->que_array = (int *)malloc(sizeof(int) * MAX); if (que->que_array == NULL) { printf("no mem\n"); exit(-E_NOMEMORY); } que->front = 0; que->rear = 0; que->valid_cnt = 0; que->total = MAX; } /* 判斷隊列是否已滿 */ int is_full(queue_t *que) { return (((que->rear + 1) % que->total) == (que->front)); } /* 判斷隊列是否為空 */ int is_empty(queue_t *que) { return (que->front == que->rear); } /* 元素入隊 */ void entry_queue(queue_t *que, int data) { if (is_full(que)) { printf("隊列已滿,添加后有可能會覆蓋掉前面的元素 \n"); que->front = ((que->front+1) % que->total); } que->que_array[que->rear % que->total] = data; que->rear = (que->rear+1) % que->total; que->valid_cnt++; } /* 元素出隊 */ int del_queue(queue_t *que) { int tmp; if (is_empty(que)) { printf("隊列為空 \n"); return -E_FAIL; } tmp = que->que_array[que->front % que->total]; que->front = ((que->front+1) % que->total); que->valid_cnt--; return tmp; } int main(int argc, char *argv[]) { int tem_data,i; queue_t que; init_queue(&que); #if 0 for (i = 0; i < 7; i++) { entry_queue(&que, i + 1); } printf("出隊隊列中的所有元素 \n"); while (!is_empty(&que)) { printf("%d,", del_queue(&que)); } #endif /*接下來,添加十個元素試試*/ for (i = 0; i < 10; i++) { entry_queue(&que, i + 1); } printf("出隊隊列中的所有元素 \n"); while (!is_empty(&que)) { printf("%d,", del_queue(&que)); } return 0; }
以上是“如何使用c語言實現循環隊列”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。