1、队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
2、清空队列
在使用时队列前需要清空队列,这里代码展示
Queue_Emply(unsigned char **Head,unsigned char **Tail,unsigned char *pBuff)
{
*Head = pBuff;
*Tail = pBuff;
}
3、入列
入列是在队列的后端进行插入操作,因为入列是插入一个新的元素,所以要给新入列的元素分配一个空的地址,所以这里尾指针要指向已有元素后的一个空地址;
因为尾指针指向的地址随入列元素数量而改变,因此需要考虑两个问题;①当尾指针指向缓存区末地址时,重新使尾指针指向缓存区的首地址;②当尾指针绕一圈等于头指针时,为避免出列违背先进先出的规则,头指针所在地址数据丢弃,头指针++;实现代码如下:
void Queue_DataIn(unsigned char **Head,unsigned char **Tail,unsigned char *pBuff,unsigned char QueueLen,unsigned char *pData,unsigned char DatLen)
{
**Tail = *pBuff;
*Tail++;
if( *Tail == pBuff + QueueLen)
{
*Tail = pBuff;
if(*Tail == *Head)
{
*Head++;
if(*Head == pBuff + QueueLen)
{
*Head = pBuff;
}
}
}
}
4、出列
由于先进先出的原则,所以出列元素为队头,即头指针指向地址的元素;所以头指针指向的是含有数据的地址首位,出列成功后头指针++;代码展示如下:
unsigned char Queue_DataOut(unsigned char **Head,unsigned char **Tail,unsigned char *pBuff,unsigned char QueueLen,unsigned char *pData,unsigned char DatLen)
{
unsigned char sta = 0;
if( *Head != *Tail)
{
*pBuff = **Head;
*Head++;
sta = 1;
if( *Head == pBuff + QueueLen)
{
*Head= pBuff;
}
return sta;
}
}
5、队列数据长度
有时候需要判断当前队列元素是否为零,所以代码展示:
unsigned char Queue_DataLen(unsigned char **Head,unsigned char **Tail,unsigned char *pBuff,unsigned char QueueLen)
{
if(*Tail > *Head)
{
retunrn *Tail - *Head;
}
else
{
retuen *Tail + QueueLen - *Head;
}
}