当前位置:   article > 正文

循环队列的创建,出队,入队等操作(C语言)_用循环队列实现队列的创建、出队、入队、判断队空等基本操作daima

用循环队列实现队列的创建、出队、入队、判断队空等基本操作daima

目录

队列的结构体定义

空队列的创建

队满队空判断

入队操作

出队操作


循环队列可以解决假溢出的问题,但对于队满和队空需要有额外的判断,有以下两种方式:

1. 增加变量size用来记录队列中的元素个数,根据size的大小即可判断队列是满是空;

2. 牺牲一个空间,即Front所在的位置不存储元素,队满条件即为:(Rear+1%Maxsize == Front,队空条件即为:Rear == Front;

注:本次基于第二种方法实现对循环队列的基础操作

队列的结构体定义

  1. typedef int Position;
  2. typedef int ElementType;
  3. typedef struct QNode *PtrToNode;
  4. struct QNode{
  5. ElementType *data;
  6. Position front;
  7. Position rear;
  8. int Maxsize;
  9. };
  10. typedef PtrToNode Queue;

空队列的创建

  1. Queue CreateQueue(int Maxsize){
  2. Queue Q = (Queue)malloc(sizeof(struct QNode));
  3. Q->data = (ElementType*)malloc(sizeof(ElementType) * Maxsize);
  4. Q->front = 0;
  5. Q->rear = 0;
  6. Q->Maxsize = Maxsize;
  7. return Q;
  8. }

队满队空判断

  1. // 通过浪费一个空间(即Q->front所在的位置)实现队列的空满判断;
  2. bool IsFull(Queue Q){
  3. return ((Q->rear + 1) % Q->Maxsize == Q->front);
  4. }
  5. bool IsEmpty(Queue Q){
  6. return (Q->front == Q->rear);
  7. }

入队操作

  1. bool Add(Queue Q, ElementType data){
  2. if(!IsFull(Q)){
  3. Q->rear = (Q->rear + 1) % Q->Maxsize;
  4. Q->data[Q->rear] = data;
  5. return true;
  6. }
  7. else{
  8. printf("队列已满!!!");
  9. return false;
  10. }
  11. }

出队操作

  1. ElementType Delete(Queue Q){
  2. if(!IsEmpty(Q)){
  3. Q->front = (Q->front + 1) % Q->Maxsize;
  4. return Q->data[Q->front];
  5. }
  6. else{
  7. printf("队列已空!!!");
  8. return 0;
  9. }
  10. }

完整代码如下:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<stdbool.h>
  4. typedef int Position;
  5. typedef int ElementType;
  6. typedef struct QNode *PtrToNode;
  7. struct QNode{
  8. ElementType *data;
  9. Position front;
  10. Position rear;
  11. int Maxsize;
  12. };
  13. typedef PtrToNode Queue;
  14. Queue CreateQueue(int Maxsize){
  15. Queue Q = (Queue)malloc(sizeof(struct QNode));
  16. Q->data = (ElementType*)malloc(sizeof(ElementType) * Maxsize);
  17. Q->front = 0;
  18. Q->rear = 0;
  19. Q->Maxsize = Maxsize;
  20. return Q;
  21. }
  22. // 通过浪费一个空间(即Q->front所在的位置)实现队列的空满判断;
  23. bool IsFull(Queue Q){
  24. return ((Q->rear + 1) % Q->Maxsize == Q->front);
  25. }
  26. bool IsEmpty(Queue Q){
  27. return (Q->front == Q->rear);
  28. }
  29. bool Add(Queue Q, ElementType data){
  30. if(!IsFull(Q)){
  31. Q->rear = (Q->rear + 1) % Q->Maxsize;
  32. Q->data[Q->rear] = data;
  33. return true;
  34. }
  35. else{
  36. printf("队列已满!!!");
  37. return false;
  38. }
  39. }
  40. ElementType Delete(Queue Q){
  41. if(!IsEmpty(Q)){
  42. Q->front = (Q->front + 1) % Q->Maxsize;
  43. return Q->data[Q->front];
  44. }
  45. else{
  46. printf("队列已空!!!");
  47. return 0;
  48. }
  49. }
  50. void Print(Queue Q){
  51. while(!IsEmpty(Q)){
  52. printf("%d\t", Delete(Q));
  53. }
  54. }
  55. int main(){
  56. int Maxsize;
  57. scanf("%d", &Maxsize);
  58. Queue Q = CreateQueue(Maxsize);
  59. int data;
  60. scanf("%d", &data);
  61. while(data != -1){//以-1为作为循环终止条件
  62. Add(Q, data);
  63. scanf("%d", &data);
  64. }
  65. Print(Q);
  66. return 0;
  67. }

如有错误,欢迎大家批评指正!!!

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

闽ICP备14008679号