运用数组组成顺序队列

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}

猜你喜欢

转载自blog.csdn.net/weixin_41572450/article/details/78951414