C语言队列-先进先出
这里我们介绍两种队列的形式,
第一种队列当数据插入到文件的最后,就认为这个文件已经满,将不再插入数据,这里使用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; }
每天更新pyQt5内容