当前位置:   article > 正文

数据结构——循环队列(数组)_循环队列代码

循环队列代码

一、循环队列的定义

二、循环队列图示

 

三、循环队列使用规则 

为解决队满和队空的判断条件相同。

我们 采用  损失一个单元不用的方法

即当循环队列元素的个数是MAXSIZE-1时,就认为队列已满(front指向空的单元)

这样循环队列的队满条件就变成 :

(rear+1)%MAXSIZE==front

循环队列的队空条件依旧是:

front==rear

 

四、循环队列的代码 

  1. #define MAXSIZE 4
  2. typedef int DataType;
  3. typedef struct
  4. {
  5. DataType data[MAXSIZE]; //实际上只能存MAXSIZE-1 个数据
  6. int front;
  7. int rear;
  8. }SeqQueue;
  9. //损失一个单元不用,即当循环队列中元素个数是MAXSIZE-1时,就认为队列已经满了
  10. //front指向那个不使用的单元
  11. //循环队列的队满的条件就是(rear+1)%MAXSIZE==front
  12. //队空的条件是 front==rear
  13. //初始化队列
  14. void InitQueue(SeqQueue* Q)//初始化队列函数
  15. {
  16. Q->front = Q->rear = 0;//指针初始化
  17. }
  18. //判断是否为空
  19. int EmptyQueue(SeqQueue* Q)//判断队空函数
  20. {
  21. if (Q->front == Q->rear)//队列为空
  22. return 1;
  23. else
  24. return 0;
  25. }
  26. //判断是否为满
  27. int FullQueue(SeqQueue* Q)//判断队满函数
  28. {
  29. if (Q->front == (Q->rear + 1) % MAXSIZE)//队尾指针加上1,再取余MAXSIZE的值如果等于队头指针,说明队列为满
  30. return 1;
  31. else
  32. return 0;
  33. }
  34. //入队操作
  35. void InQueue(SeqQueue* Q, DataType x)//入队函数
  36. {
  37. if (FullQueue(Q))
  38. {
  39. printf("队列已满,无法继续入队\n");
  40. return;
  41. }
  42. else
  43. {
  44. Q->rear = (Q->rear + 1) % MAXSIZE;//更新队尾指针rear,队尾指针加1再取余MAXSIZE,将数组形成一个循环
  45. Q->data[Q->rear] = x;//将入队的数据放到队列数组,更新后的rear所指向的位置
  46. }
  47. }
  48. //出队操作
  49. void DeQueue(SeqQueue* Q)//出队函数
  50. {
  51. if (EmptyQueue(Q))
  52. {
  53. printf("队列已空,无法继续出队\n");
  54. return;
  55. }
  56. else
  57. {
  58. Q->front = (Q->front + 1) % MAXSIZE; //更新队头指针front, 队头指针加1再取余MAXSIZE, 将数组形成一个循环
  59. }
  60. }
  61. //取队头操作
  62. DataType GetFront(SeqQueue* Q)//取队头函数
  63. {
  64. if (EmptyQueue(Q))
  65. {
  66. printf("队列已空,无队头元素\n");
  67. return 0;
  68. }
  69. else
  70. {
  71. int t; //因为front指向的位置无元素,队头元素在front指向的后一位
  72. t = (Q->front + 1) % MAXSIZE; //将 队头指针加1再取余MAXSIZE 的值赋给t
  73. return Q->data[t]; //返回数组中下标为t的元素
  74. }
  75. }
  76. void ShowQueue(SeqQueue* Q)//显示队中元素函数
  77. {
  78. int p = Q->front;
  79. if (p == Q->rear)
  80. printf("队列为空,无元素!\n");
  81. else
  82. {
  83. printf("\n从队头起队列中的个元素为:");
  84. while (p != Q->rear)
  85. {
  86. printf("%5d", Q->data[(p + 1) % MAXSIZE]);
  87. p++;
  88. p %= MAXSIZE; //使得p能从数组的首位地址重新遍历,形成循环,打印出所有的数组元素
  89. }
  90. }
  91. }

五、循环队列的函数使用

1.入队函数:InQueue

  1. int main()
  2. {
  3. SeqQueue SQ;
  4. InitQueue(&SQ);//初始化
  5. InQueue(&SQ, 3);//入队
  6. InQueue(&SQ, 4);//入队
  7. InQueue(&SQ, 5);//入队
  8. //插入3次,满了
  9. InQueue(&SQ, 5);//第四次插入不了
  10. ShowQueue(&SQ);//打印数组中所有的值
  11. return 0;
  12. }

 结果:

插入3次,满了。第四次插入不了

 

 2.取队头函数GetFront

  1. int main()
  2. {
  3. SeqQueue SQ;
  4. InitQueue(&SQ);//初始化
  5. InQueue(&SQ, 3);//入队
  6. InQueue(&SQ, 4);//入队
  7. InQueue(&SQ, 5);//入队
  8. //插入3次,满了
  9. printf("循环队列中的元素依次是:");
  10. ShowQueue(&SQ);//打印数组中所有的值
  11. printf("\n");
  12. DataType x = GetFront(&SQ);//取队头元素
  13. printf("\n队头元素是:%d \n", x);
  14. return 0;
  15. }

结果:

 

3.出队函数DeQueue

  1. int main()
  2. {
  3. SeqQueue SQ;
  4. InitQueue(&SQ);//初始化
  5. InQueue(&SQ, 3);//入队
  6. InQueue(&SQ, 4);//入队
  7. InQueue(&SQ, 5);//入队
  8. //插入3次,满了
  9. printf("循环队列中的元素依次是:");
  10. ShowQueue(&SQ);//打印数组中所有的值
  11. printf("\n\n");
  12. DeQueue(&SQ);//出队一次
  13. InQueue(&SQ,99);//出队之后,再入队一次
  14. printf("操作后循环队列中的元素依次是:");
  15. ShowQueue(&SQ);//打印数组中所有的值
  16. return 0;
  17. }

结果;

出队之后,再入队一次,打印新的循环队列

六、心得体会

  1. 队列是一种运算受限制的线性表,插入在队尾,删除在队头。
  2. 队列的逻辑结构和线性表也相同,数据元素之间存在一对一的关系,它的主要特性是先进先出
  3. 循环队列是队列的一种顺序表示和实现方法。与顺序栈类似,在队列的顺序存储结构中,用一组地址连续的存储单元依次存放从队头到队尾的元素。
  4. 由于队列中队头和队尾的位置都是动态变化的,因此需要附设两个指针front和rear,分别知识队头元素和队尾元素在数组中的位置。
  5. 普通的顺序队列会有假溢出,一个巧妙的办法就是将顺序队列的数组看成一个环状的空间,即规定最后一个单元的后继为第一个单元,我们形象地称之为循环队列。

 

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

闽ICP备14008679号