版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41572450/article/details/78951414
最近学习了用数组构成循环队列,总结如下:
顺序队列基本操作
0. 定义一个队列
1. 队列初始化
2. 判断队列是否为空
3. 判断队列是否满
4. 入队
5. 出队
6. 遍历
0.定义一个队列
定义一个管理队列的结构体
#define MAXSIZE 17 //最多放MAXSIZE - 1 个元素
typedef uint8_t datatype;
typedef struct{
uint8_t front;
uint8_t rear;
uint8_t size; //队头、队尾、容量
datatype data[MAXSIZE];
}seq,*sq;
1. 队列初始化
初始化获得一个队列
sq init_queue(void)
{
sq q;
q->size = MAXSIZE;
q->front = q->rear = 0; //任意相等值都行
return q;
}
2. 判断队列是否为空
当头指针和尾指针相等是则是空队列
uint8_t is_empty(sq q)
{
return q->front == q->rear;
}
3.判断队列是否满
当尾指针加一对队列容量取余后等于头指针则队列已满
uint8_t is_full(sq q)
{
return q->front == (q->rear + 1) % q->size;
}
4.入队
入队之前要判断队列是否是满的
uint8_t en_queue(datatype n ,sq q)
{
if(is_full(q))
return 0;
q->rear = (q->rear + 1) % q->size;
q->data[q->rear] = n;
return 1;
}
5.出队
出队之前要判断队列是否是已空
uint8_t de_queue(datatype *m ,sq q)
{
if(is_empty(q))
return 0;
q->front = (q->front + 1) % q->size;
*m = q->data[q->front];
return 1;
}
6.遍历
下面是遍历队列里元素并求均值
datatype avg_queue(sq q)
{
uint8_t i;
uint32_t sum=0;
if(is_empty(q))
return 0;
for(i=((q->front + 1) % q->size);i!=q->rear;i=((i + 1) % q->size))
{
sum+=q->data[i];
}
sum+=q->data[i];
return sum/((q->rear - q->front + q->size) % q->size);
}