队列最主要的作用啊是用来管理数据流的,防止数据因为传输频率过快得不到及时处理而丢失。
队列的原理就是先进先出,类似于管道
循环队列的引用 正常的队列出队和入队都是通过队首和队尾指针的移位来实现的 如果用正常的顺序队列的话 buff也会根据首尾指针的移位而一直增加其分配的数据存储空间,为解决这一问题我们引用了循环队列
跟着程序进行逻辑讲解
queue.h中定义队列结构体
typedef struct //队列的结构定义
{
int *base ; 队列缓存指针
int front ; 首地址指针
int rear ; 尾地址指针
} SqQueue ;
#define MAXIZE 11 //队列长度 跟初始化分配的内存空间
初始化队列
void InitQueue( SqQueue *Q )
{
Q->base = ( int* )malloc( sizeof( int ) * MAXIZE ) ;
Q->front = Q->rear = 0 ;
} C 库函数 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针。
首尾地址指向0
入队
void EnQueue( SqQueue *Q , int val )
{
if( ( Q->rear + 1 ) % MAXIZE == Q->front ) DeQueue(Q); //用来保证队列满的时候,数组仍留出一个空闲空间 判断队满后出队一个 然后再让数据入队
Q->base[ Q->rear ] = val ;
Q->rear = ( Q->rear +1 ) % MAXIZE ;
} ( Q->rear +1 ) % MAXIZ(加一% MAXIZE 求余的含义就是让指针在0到MAXIZE循环)
出队
void DeQueue( SqQueue *Q ) //出队
{
if( Q->front == Q->rear ) return; //队中没有数据
else Q->front = ( Q->front + 1 ) % MAXIZE ;
} 同上一样
运用小技巧就是我们可以直接用(Q.base[Q.rear])-(Q.base[Q.front])首尾指针来获取我们当前的起始队列数据 进行运算 或者可以通过指针(+-)来获取当前队列任何一处的数据