当前位置:   article > 正文

循环队列(用数组实现)_使用数组实现循环队列,完成循环队列的循环包括初始化、入队和出队。

使用数组实现循环队列,完成循环队列的循环包括初始化、入队和出队。

目录

1.循环队列

2.循环队列的定义及初始化

3.入队与出队

4.队列判空和判满

5.返回队尾和队头数据

6.队列的销毁


1.循环队列

循环队列,遵循队列思想, 可以存储k个数据,增加空间的复用率。


2.循环队列的定义及初始化

  1. typedef int TypeData;
  2. typedef struct CircleQueue
  3. {
  4. TypeData* a; //开辟数组作为循环队列的主体
  5. int head; //队头的位置
  6. int tail; //队尾的位置
  7. int size; //记录当前存放的数量
  8. int capacity; //记录最大的存放数量
  9. }CQ;
  1. void Init(CQ* pr,TypeData k)
  2. {
  3. assert(pr); //断言pr不为空
  4. pr->capacity = k;//初始化最大存放值为k
  5. pr->head = pr->tail = pr->size = 0;//初始化队尾和队头位置
  6. TypeData* ptr = (TypeData*)malloc(sizeof(TypeData) * k);//开辟数组
  7. if (ptr == NULL)
  8. {
  9. perror("malloc:");
  10. return;
  11. }
  12. pr->a = ptr;
  13. }

3.入队与出队

  1. void CPush(CQ* pr,TypeData val)
  2. {
  3. if (pr->size == pr->capacity) //因为循环队列有最大存放量,所以需要判断是否有空位可以入队
  4. {
  5. printf("数据已满,不可插入数据\n");
  6. return;
  7. }
  8. pr->a[pr->tail] = val; //在队尾入队
  9. pr->tail = (pr->tail + 1) % (pr->capacity);
  10. //队尾向后移动一位,如果队尾已经在数组末位,则移动到数组首位
  11. pr->size++; //当前存储数据个数加一
  12. }
  13. void CPop(CQ* pr)
  14. {
  15. if (pr->size == 0)
  16. {
  17. printf("队列为空,不可出队\n");
  18. return;
  19. }
  20. pr->head = (pr->head + 1) % (pr->capacity);
  21. //队头向后移动一位,如果队头在数组末位,则移动到数组首位
  22. pr->size--; //当前存储数据个数减一
  23. }

4.队列判空和判满

  1. int Empty(CQ* pr)
  2. {
  3. return(pr->size == 0);
  4. }
  5. int Full(CQ* pr)
  6. {
  7. return(pr->size == pr->capacity);
  8. }

因为我们这里引入了size和capacity所以只需要判断这俩变量的关系即可。


5.返回队尾和队头数据

  1. //如果队列不为空,直接返回即可
  2. TypeData Front(CQ* pr)
  3. {
  4. if (pr->size == 0)
  5. {
  6. printf("队列为空\n");
  7. return -1;
  8. }
  9. return(pr->a[pr->head]);
  10. }
  11. //如果队列不为空,返回队尾前一个数据
  12. TypeData Back(CQ* pr)
  13. {
  14. if (pr->size == 0)
  15. {
  16. printf("队列为空\n");
  17. return -1;
  18. }
  19. int pos = pr->tail - 1;
  20. if (pos < 0) //如果队尾在数组首位,则它的前一个则为数组末位
  21. pos = pr->capacity - 1;
  22. return (pr->a[pos]);
  23. }

6.队列的销毁

  1. //直接释放数组a即可
  2. void Destroy(CQ* pr)
  3. {
  4. free(pr->a);
  5. pr->size = pr->capacity = pr->head = pr->tail = 0;
  6. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/582715
推荐阅读
相关标签
  

闽ICP备14008679号