使用不完全填满数组的实现的循环FIFO(队列)
2016-05-24 11:38
1011 查看
通过不完全数组实现的队列完成循环FIFO的基本操作:
1。判空,判满
2.增加元素,删除元素
1。判空,判满
2.增加元素,删除元素
//-------------FIFO仿真------ #define FIFO_Data_Type int //使用不完全填满数组的技巧区分队列空和满 typedef struct { FIFO_Data_Type*buf; uint8_t max_len; uint8_t front; //头指针,若队列不空,指向队列的头元素 uint8_t rear; //尾指针,若队列不空,指向队列尾元素的下一个位置 }FIFO_TypeDef; void Init_Fifo(FIFO_TypeDef*Fifo,FIFO_Data_Type*buf, uint8_t max_len) { Fifo->buf = buf; Fifo->max_len = max_len; Fifo->front = 1; Fifo->rear = 0; } unsigned char Is_Fifo_Full(FIFO_TypeDef*Fifo) { return(Fifo->rear + 2) % Fifo->max_len == Fifo->front; } unsigned char Is_Fifo_Empty(FIFO_TypeDef*Fifo) { return(Fifo->rear + 1) % Fifo->max_len == Fifo->front; } //删除FIFO里的数据同时,返回该元素的值 void delete_Fifo_Elem(FIFO_TypeDef*Fifo) { if (Is_Fifo_Empty(Fifo)) { return; } else { Fifo->front = (Fifo->front+1)%Fifo->max_len; } } void insert_Fifo_elem(FIFO_TypeDef*Fifo,FIFO_Data_Type*value) { if (Is_Fifo_Full(Fifo)) delete_Fifo_Elem(Fifo); Fifo->rear = (Fifo->rear + 1) % Fifo->max_len; Fifo->buf[Fifo->rear] = *value; //printf("%d ", Fifo->buf[Fifo->rear]); } unsigned char Fifo_Cur_Lenght(FIFO_TypeDef*Fifo) { if (Is_Fifo_Empty(Fifo)) return 0; if (Is_Fifo_Full(Fifo)) return Fifo->max_len-1; return (Fifo->rear - Fifo->front + Fifo->max_len+1) % Fifo->max_len; } void Display_Fifo(FIFO_TypeDef*Fifo) { unsigned char i, fifo_len,rear; fifo_len=Fifo_Cur_Lenght(Fifo); printf("fifo_len %d\r\n", fifo_len); rear = Fifo->front; for (i = 0; i < fifo_len; i++) { printf("rear %d %d \r\n", rear,Fifo->buf[rear]); rear = (++rear) % Fifo->max_len; } } int main(void) { unsigned char i = 0; FIFO_Data_Type buf[100]; FIFO_Data_Type tmp = 100; FIFO_TypeDef FIFO; Init_Fifo(&FIFO,buf,100); for (i = 0; i < 20; i++) { tmp++; insert_Fifo_elem(&FIFO, &(tmp)); //printf("%d \r\n", Fifo_Cur_Lenght(&FIFO)); } Display_Fifo(&FIFO); printf("delete_Fifo_Elem\r\n"); for (i = 0; i < 20; i++) { delete_Fifo_Elem(&FIFO); //printf("%d \r\n", Fifo_Cur_Lenght(&FIFO)); } Display_Fifo(&FIFO); while (1); return 0; }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- C#数据结构之顺序表(SeqList)实例详解
- Lua和C语言的交互详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法