4环形队列的实现(C语言)

Posted sbtblogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4环形队列的实现(C语言)相关的知识,希望对你有一定的参考价值。


一、实现原理如下图所示

 技术图片

环形队列实现需注意以下四点(本质上是和“3、一个简单队列的实现”一样的):
(1)往队列中写数据
memcpy(&g_tQue[g_iWritePos],pNode,sizeof(T_QUEUE));
g_iWritePos = (g_iWritePos + 1) % QUEUE_SIZE_MAX;

(2)从队列中读出数据
memcpy(pNode,&g_tQue[g_iReadPos],sizeof(T_QUEUE));
g_iReadPos = (g_iReadPos + 1) % QUEUE_SIZE_MAX;
(3)队列放满数据
((g_iWritePos + 1) % QUEUE_SIZE_MAX) == g_iReadPos),下一个要写的位置等于要读的位置,
则队列放满,实际上队列满的时候,里边存放的QUEUE_SIZE_MAX - 1个数据,这样做是为了和空
队列加以区分管

(4)队列为空(没有数据)
g_iWritePos == g_iReadPos,当前要写的位置等于当前要写的位置,则队列为空
二、代码实现如下技术图片

 

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 
 5 #define QUEUE_SIZE_MAX        10            
 6 #define MY_BUF_SIZE           128
 7 
 8 typedef struct
 9     int type;
10     int reserve;
11     int buf[MY_BUF_SIZE];
12 T_QUEUE;
13 
14 static T_QUEUE g_tQue[QUEUE_SIZE_MAX];
15 
16 static int g_iReadPos = 0;
17 static int g_iWritePos = 0;;
18 
19 static int isFull(void)
20 
21     return (((g_iWritePos + 1) % QUEUE_SIZE_MAX) == g_iReadPos);
22 
23 
24 static int isEmpty(void)
25 
26     return (g_iWritePos == g_iReadPos);
27 
28 
29 static int PutData(T_QUEUE *pNode)
30 
31     if (isFull())
32     
33         printf("queque is overflow!\\r\\n");
34         return -1;
35     
36     else
37     
38         memcpy(&g_tQue[g_iWritePos],pNode,sizeof(T_QUEUE));    
39         g_iWritePos = (g_iWritePos + 1) % QUEUE_SIZE_MAX;
40         return 0;
41     
42 
43 
44 static int GetData(T_QUEUE *pNode)
45 
46     if (isEmpty())
47     
48         printf("queque is empty!\\r\\n");
49         return -1;
50     
51     else
52     
53         memcpy(pNode,&g_tQue[g_iReadPos],sizeof(T_QUEUE));
54         g_iReadPos = (g_iReadPos + 1) % QUEUE_SIZE_MAX;
55     
56     
57 

 

以上是关于4环形队列的实现(C语言)的主要内容,如果未能解决你的问题,请参考以下文章

C语言实现环形队列的原理和方法

C语言实现环形队列的原理和方法

go语言数据结构 环形队列

柔性数组和环形队列之间的故事

什么是环形队列,采用什么方法实现环形队列

环形队列-高效定时触发