无论是单片机还是MCU设备,数据处理应用中经常要使用FIFO队列,而Queue循环队列就是最经典、最基础的数据结构应用。
通过大学学习的数据结构导论,结合自己的项目实践,用C语言描述和实现了循环队列的功能。
初始状态
初始队列状态时,队列的数据头指向和数尾的指向-1 也就是未开始状态,即:(Q)->front = (Q)->rear = -1 。

入队4个元素
数据元素ABCD按照次序,依次进入队列填满位置,这个时候,未出过数据front数据头就仍指向-1位置,因为入队4个数据,rear数据尾就指向3位置(-1+4=3)。



//#################################################
//############# C数据结构 -- 循环队列 ##############
//#################################################
//队列位置总数量
#define MAXSIZE 20
//队列单个元素结构体
typedef struct
{
uint8_t data[1024];
uint8_t com;
}ELemType;
//队列结构体
typedef struct
{
ELemType queue[MAXSIZE];
int8_t front,rear;
}queuetype;
//################## 队列初始化 ##################//
void init_queue(queuetype *Q)
{
Q->front = Q->rear = -1;
}
//################## 入队列 ##################//
void enter_queue(queuetype *Q, ELemType x)
{
//只入队不出队时,到最大数量时溢出
if ( Q->front == -1 && (Q->rear+1) == MAXSIZE )
{
printf("溢出!EER1\n");
}
//取余刚好等于队列头时为溢出
else if ((Q->rear+1) % MAXSIZE == Q->front)
{
printf("溢出!EER2\n");
}
//正常入队
else
{
Q->rear = (Q->rear+1) % MAXSIZE;//位指针累加后移
Q->queue[Q->rear] = x;//新元素复制赋值给队列尾单元
}
}
//################## 出队列 ##################//
void delete_queue(queuetype *Q)
{
//front头等于尾时,队列为空
if ( Q->front == Q->rear )
{
return;
}
Q->front = (Q->front+1)%MAXSIZE;
printf("出队!\n");
}
//################## 取队首元素 ##################//
ELemType gethead( queuetype *Q)
{
return (Q->queue[(Q->front+1)%MAXSIZE]);
}
//################## 判断队列中是否为空 ##################//
int empty(queuetype *Q)
{
if ( Q->front == Q->rear )
{
return 1;//队列为空
}
else
{
return 0;//队列不为空
}
}
//################## 显示队列中所有COM数据 ##################//
void display_all(queuetype *Q)
{
int i = Q->front+1;
if(!empty(Q))
{
while(i % MAXSIZE != Q->rear)
{
printf("%d ",Q->queue[ i++ % MAXSIZE ].com );
}
if (Q->rear != -1 )
{
printf("%d ",Q->queue[ i % MAXSIZE ].com );//显示队尾
}
}
}
//################## 查询队列元素COM ##################//
int check_all_for_com(queuetype *Q, int8_t comNumber)
{
int i = Q->front+1;
if(!empty(Q))
{
while(i % MAXSIZE != Q->rear)
{
if (comNumber== Q->queue[ i++ % MAXSIZE ].com)
{
return 1;
}
}
}
return 0;
}