一个循环队列的实现及测试函数

[复制链接]
 楼主| keer_zu 发表于 2022-1-7 14:13 | 显示全部楼层 |阅读模式
这是一个通过一个连续地址端存储空间(数组)和头、尾的指标实现的FIFO。配有测试用例,首先看头文件对数据结构和接口的定义:

  1. #ifndef __ROUND_ROBIN__
  2. #define __ROUND_ROBIN__

  3. #define QUE_OK 0
  4. #define QUE_ERR -1

  5. #define QUE_TURN 1
  6. #define QUE_FALSE 0
  7.        

  8. #ifndef NULL
  9. #define NULL ((void *)0)
  10. #endif

  11. typedef struct{
  12.         char *buf;
  13.         unsigned int buf_size;
  14.         int front;
  15.         int rear;
  16. }robin_queue_t;


  17. int queue_init(robin_queue_t *q);
  18. int queue_length(robin_queue_t *q);
  19. int queue_is_full(robin_queue_t *q);
  20. int queue_insert(robin_queue_t *q,char item);
  21. int queue_is_empty(robin_queue_t *q);
  22. char *queue_get_item(robin_queue_t *q);
  23. int queue_del_item(robin_queue_t *q);



  24. #endif
  25.   

本贴及后面讲解都是原创,申请"原创”和“编辑推荐”。@21ic小管家 @21小跑堂

@qin552011373


评分

参与人数 1威望 +10 收起 理由
qin552011373 + 10 很给力!

查看全部评分

 楼主| keer_zu 发表于 2022-1-7 14:14 | 显示全部楼层
.c文件,实现:
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include "round_robin_queue.h"
  4. #include "sys.h"

  5. extern void ENTER_CRITICAL() ;
  6. extern void EXIT_CRITICAL() ;

  7. #define RECV_BUF_SIZE 512  

  8. char ec20_recv_buf[RECV_BUF_SIZE];

  9. robin_queue_t  ec20_recv_queue = {
  10.         .buf = ec20_recv_buf,
  11.         .buf_size = RECV_BUF_SIZE
  12. };


  13. /********************** frame buffer queue ******************************/
  14. int queue_init(robin_queue_t *q)
  15. {
  16.         q->front = 0;
  17.         q->rear = 0;
  18.         memset(q->buf,0,q->buf_size);
  19. }

  20. int queue_length(robin_queue_t *q)
  21. {
  22.         if(q == NULL)
  23.                 return QUE_ERR;
  24.        
  25.         if(q->rear >= q->front) {
  26.                 return q->rear - q->front;
  27.         } else {
  28.                 return q->rear + q->buf_size - q->front;
  29.         }
  30. }



  31. int queue_is_full(robin_queue_t *q)
  32. {
  33.         if(q == NULL)
  34.                 return QUE_ERR;
  35.        
  36.         if(q->front == (q->rear + 1) % q->buf_size) //
  37.                 return QUE_TURN;  
  38.         else  
  39.                 return QUE_FALSE;  
  40. }


  41. int queue_insert(robin_queue_t *q,char item)
  42. {
  43.         if(q == NULL)
  44.                 return QUE_ERR;  
  45.        
  46.         if(queue_is_full(q))
  47.                 return QUE_ERR;  

  48.        
  49.         ENTER_CRITICAL();
  50.         q->buf[q->rear] = item;
  51.         q->rear = (q->rear + 1) % q->buf_size; //
  52.         EXIT_CRITICAL();

  53.        
  54.         return QUE_OK;  

  55. }

  56. int queue_is_empty(robin_queue_t *q)
  57. {
  58.         if(q == NULL)
  59.                 return QUE_ERR;
  60.        
  61.         if(q->front == q->rear) {
  62.                 return QUE_TURN;  
  63.         } else  {
  64.                 return QUE_FALSE;  
  65.         }
  66. }

  67. char *queue_get_item(robin_queue_t *q)
  68. {
  69.         char *item;
  70.        
  71.         if(!queue_is_empty(q)){
  72.                 item = q->buf + q->front;
  73.                
  74.                 ENTER_CRITICAL();
  75.                 q->front = (q->front + 1) % q->buf_size;
  76.                 EXIT_CRITICAL();
  77.                
  78.                 return item;
  79.         } else {
  80.                 return NULL;
  81.         }
  82. }

  83. int queue_del_item(robin_queue_t *q)
  84. {  
  85.         if(q == NULL)
  86.                 return QUE_ERR;
  87.        
  88.         if(queue_is_empty(q))
  89.                 return QUE_ERR;

  90.         ENTER_CRITICAL();
  91.         q->front  = (q->front  + 1) % q->buf_size;  
  92.         EXIT_CRITICAL();

  93.         return QUE_OK;       
  94. }



 楼主| keer_zu 发表于 2022-1-7 14:18 | 显示全部楼层
测试用例:

  1. ///////////////////////////////////////////// test ////////////////////////////////////

  2. #define TEST_BUF_SIZE 100
  3. char test_buf[TEST_BUF_SIZE];

  4. robin_queue_t  test_queue = {
  5.         .buf = test_buf,
  6.         .buf_size = TEST_BUF_SIZE
  7. };


  8. void _test_queue(void)
  9. {
  10.         int i,ret;
  11.         char *item = NULL;
  12.         queue_init(&test_queue);

  13.         for(i = 1;i <= test_queue.buf_size + 10;i ++) {
  14.                 ret = queue_insert(&test_queue,(char)i);
  15.                 if(ret != QUE_OK) {
  16.                         printf("erro:%d  ",i);
  17.                 }
  18. }

  19. printf("====len:%d\n",queue_length(&test_queue));

  20.         while(!queue_is_empty(&test_queue)) {
  21.                 item = queue_get_item(&test_queue);
  22.                 if(item != NULL) {
  23.                         printf("item:%d  ",*item);
  24.                 }
  25.         }

  26.         printf("\n\n");

  27.         int it = 0;//test_queue.buf_size/2;

  28.         while(!queue_is_full(&test_queue)) {
  29.                 printf("inst:%d  ",it);
  30.                 queue_insert(&test_queue,(char)it);
  31.                 it ++;
  32.         }

  33.         printf("\n\n");
  34.         while(!queue_is_empty(&test_queue)) {
  35.                 item = queue_get_item(&test_queue);
  36.                 if(item != NULL) {
  37.                         printf("item:%d  ",*item);
  38.                 }
  39.         }
  40.         printf("\n\n");

  41.         printf("====len:%d\n",queue_length(&test_queue));
  42. }

  43. int main(void)
  44. {
  45.         _test_queue();
  46.         return 0;
  47. }


 楼主| keer_zu 发表于 2022-1-7 14:21 | 显示全部楼层
测试结果:
[ops@mit-service160-132 ~]$ ./oq
erro:100  erro:101  erro:102  erro:103  erro:104  erro:105  erro:106  erro:107  erro:108  erro:109  erro:110  ====len:99
item:1  item:2  item:3  item:4  item:5  item:6  item:7  item:8  item:9  item:10  item:11  item:12  item:13  item:14  item:15  item:16item:17  item:18  item:19  item:20  item:21  item:22  item:23  item:24  item:25  item:26  item:27  item:28  item:29  item:30  item:31item:32  item:33  item:34  item:35  item:36  item:37  item:38  item:39  item:40  item:41  item:42  item:43  item:44  item:45  item:46item:47  item:48  item:49  item:50  item:51  item:52  item:53  item:54  item:55  item:56  item:57  item:58  item:59  item:60  item:61item:62  item:63  item:64  item:65  item:66  item:67  item:68  item:69  item:70  item:71  item:72  item:73  item:74  item:75  item:76item:77  item:78  item:79  item:80  item:81  item:82  item:83  item:84  item:85  item:86  item:87  item:88  item:89  item:90  item:91item:92  item:93  item:94  item:95  item:96  item:97  item:98  item:99

inst:0  inst:1  inst:2  inst:3  inst:4  inst:5  inst:6  inst:7  inst:8  inst:9  inst:10  inst:11  inst:12  inst:13  inst:14  inst:15  inst:16  inst:17  inst:18  inst:19  inst:20  inst:21  inst:22  inst:23  inst:24  inst:25  inst:26  inst:27  inst:28  inst:29  inst:30  inst:31  inst:32  inst:33  inst:34  inst:35  inst:36  inst:37  inst:38  inst:39  inst:40  inst:41  inst:42  inst:43  inst:44  inst:45  inst:46  inst:47  inst:48  inst:49  inst:50  inst:51  inst:52  inst:53  inst:54  inst:55  inst:56  inst:57  inst:58  inst:59  inst:60  inst:61  inst:62  inst:63  inst:64  inst:65  inst:66  inst:67  inst:68  inst:69  inst:70  inst:71  inst:72  inst:73  inst:74  inst:75  inst:76  inst:77  inst:78  inst:79  inst:80  inst:81  inst:82  inst:83  inst:84  inst:85  inst:86  inst:87  inst:88  inst:89  inst:90  inst:91  inst:92  inst:93  inst:94  inst:95  inst:96  inst:97  inst:98

====len:99
item:0  item:1  item:2  item:3  item:4  item:5  item:6  item:7  item:8  item:9  item:10  item:11  item:12  item:13  item:14  item:15  item:16  item:17  item:18  item:19  item:20  item:21  item:22  item:23  item:24  item:25  item:26  item:27  item:28  item:29  item:30  item:31  item:32  item:33  item:34  item:35  item:36  item:37  item:38  item:39  item:40  item:41  item:42  item:43  item:44  item:45  item:46  item:47  item:48  item:49  item:50  item:51  item:52  item:53  item:54  item:55  item:56  item:57  item:58  item:59  item:60  item:61  item:62  item:63  item:64  item:65  item:66  item:67  item:68  item:69  item:70  item:71  item:72  item:73  item:74  item:75  item:76  item:77  item:78  item:79  item:80  item:81  item:82  item:83  item:84  item:85  item:86  item:87  item:88  item:89  item:90  item:91  item:92  item:93  item:94  item:95  item:96  item:97  item:98

====len:0


qin552011373 发表于 2022-1-7 14:44 | 显示全部楼层
找机会换掉我的FIFO试试这个
 楼主| keer_zu 发表于 2022-1-7 16:15 | 显示全部楼层
qin552011373 发表于 2022-1-7 14:44
找机会换掉我的FIFO试试这个

有空再帮我多测测,有问题随时反馈
qin552011373 发表于 2022-1-7 17:57 | 显示全部楼层
keer_zu 发表于 2022-1-7 16:15
有空再帮我多测测,有问题随时反馈

没问题
 楼主| keer_zu 发表于 2022-1-12 10:01 | 显示全部楼层
@21ic小管家 至少先给个编辑推荐吧
 楼主| keer_zu 发表于 2025-2-6 11:40 | 显示全部楼层
循环队列
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1478

主题

12912

帖子

55

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1478

主题

12912

帖子

55

粉丝
快速回复 在线客服 返回列表 返回顶部