這里我們介紹兩種隊列的形式,
第一種隊列當數據插入到文件的最后,就認為這個文件已經滿,將不再插入數據,這里使用head 和 tail表示要插入和提取的數據位置
queue隊列的聲明文件 02queue.h
/* queue隊列 */ #include <stdio.h> #ifndef __O2QUEUE_H__ #define __02QUEUE_H__ typedef struct { int buf[SIZE]; int head; int tail; } queue; void queue_init(queue *); void queue_deinit(queue *); int queue_size(queue *); int queue_empty(queue *); int queue_full(queue *); int queue_push(queue *, int); int queue_pop(queue *, int *); int queue_top(queue *, int *); #endif
queue隊列的02queue.c文件
/* queue隊列 */ #include "02queue.h" void queue_init(queue *p_queue) { p_queue->head = 0; p_queue->tail = 0; } void queue_deinit(queue *p_queue) { p_queue->head = 0; p_queue->tail = 0; } int queue_size(queue *p_queue) { return p_queue->tail - p_queue->head; } int queue_empty(queue *p_queue) { return !(p_queue->tail - p_queue->head); } int queue_full(queue *p_queue) { return p_queue->tail >= SIZE; } int queue_push(queue *p_queue, int val) { if (p_queue->tail >= SIZE) { return -1; } p_queue->buf[p_queue->tail] = val; p_queue->tail++; return 0; } int queue_pop(queue *p_queue, int *p_val) { if (p_queue->tail == p_queue->head){ return -1; } *p_val = p_queue->buf[p_queue->head]; p_queue->head++; return 0; } int queue_top(queue *p_queue, int *p_val) { if (p_queue->tail == p_queue->head){ return -1; } *p_val = p_queue->buf[p_queue->head]; return 0; }
queue隊列的 02main_queue.c隊列文件
/* queue隊列主函數 */ #include <stdio.h> #include <stdlib.h> #include "02queue.h" int main() { int val = 0; queue q = {0}; queue_init(&q); queue_push(&q, 20); queue_push(&q, 30); printf("隊列的大小是%d\n", queue_size(&q)); printf("隊列是否為空 %d\n", queue_empty(&q)); printf("隊列是否為滿 %d\n", queue_full(&q)); queue_pop(&q, &val); printf("抽取的數據是%d\n", val); printf("隊列的大小是%d\n", queue_size(&q)); queue_top(&q, &val); printf("抽取的數據是%d\n", val); printf("隊列的大小是%d\n", queue_size(&q)); queue_deinit(&q); }
第二種方式 相當於是一塊內存位置在上面進行移動,當最后位置存在數時,可以通過插入位置變成0,插入到位置為0的位置,重新開始插入,直到所有的位置都有數,這里使用qty和tail作為變量
03loop_queue.h
/* 循環隊列 */ #ifndef __03LOOP_QUEUE_H__ #define __03LOOP_QUEUE_H__ #include<stdio.h> #include<stdlib.h> typedef struct { int buf[SIZE]; int qty; int tail; } queue; int get_head(queue* ); //進行隊列的初始化 void queue_init(queue* ); //進行隊列內容的刪除 void queue_deinit(queue* ); //獲得隊列的尺寸 int queue_size(queue* ); //判斷隊列是否為空 int queue_empty(queue* ); //判斷隊列是否為滿 int queue_full(queue* ); //在隊列里進行插入 int queue_push(queue* , int ); int queue_pop(queue* p_queue, int* p_val); int queue_top(queue* p_queue, int* p_val); #endif
03queue_loop.c
/* 循環隊列 */ #include "03loop_queue.h" int get_head(queue* p_queue) { if(p_queue->tail >= p_queue->qty) { return p_queue->tail - p_queue->qty; } return SIZE - (p_queue->qty - p_queue->tail); } //進行隊列的初始化 void queue_init(queue* p_queue) { p_queue->qty = 0; p_queue->tail = 0; } //進行隊列內容的刪除 void queue_deinit(queue* p_queue) { p_queue->qty = 0; p_queue->tail = 0; } //獲得隊列的尺寸 int queue_size(queue* p_queue) { return p_queue->qty; } //判斷隊列是否為空 int queue_empty(queue* p_queue) { return (!p_queue->qty); } //判斷隊列是否為滿 int queue_full(queue* p_queue) { return (p_queue->qty == SIZE); } //在隊列里進行插入 int queue_push(queue* p_queue, int val) { if (p_queue->qty == SIZE) { return -1; } if (p_queue->tail == SIZE) { p_queue->tail = 0; } p_queue->buf[p_queue->tail] = val; p_queue->tail++; \ p_queue->qty++; return 0; } int queue_pop(queue* p_queue, int* p_val) { if (!p_queue->qty) { return -1; } *p_val = p_queue->buf[get_head(p_queue)]; p_queue->qty--; return 0; } int queue_top(queue* p_queue, int* p_val) { if (!p_queue->qty) { return -1; } *p_val = p_queue->buf[get_head(p_queue)]; return 0; }
03main_loop.c
/* 循環隊列的主函數 */ #include <stdio.h> #include "03loop_queue.h" int main(void){ queue q = {0}; int val = 0; queue_init(&q); queue_push(&q, 1); queue_push(&q, 2); printf("隊列是否為空 %d\n", queue_empty(&q)); printf("隊列是否為滿 %d\n", queue_full(&q)); printf("隊列大小是 %d\n", queue_size(&q)); queue_pop(&q, &val); printf("獲取的數據是%d\n", val); printf("隊列大小是 %d\n", queue_size(&q)); queue_top(&q, &val); printf("獲取的數據是%d\n", val); printf("隊列大小是 %d\n", queue_size(&q)); queue_deinit(&q); return 0; }