当前位置:   article > 正文

数据结构之循环队列基本操作(c语言)_编写循环队列完成队列的初始化、建立队列、插入元素、删除元素等操作.

编写循环队列完成队列的初始化、建立队列、插入元素、删除元素等操作.

 队列
队列是一种先进先出(First In First Out)的线性表。它只允许在表的一端进行插入,在另一端删除元素。

允许插入的一端成为队尾,允许删除的一端成为队头

循环队列的顺序表示和实现:

队列有顺序表示和链式表示两种方式,我们此处用顺序表示

队列的顺序存储结构:

  1. #define MAXSIZE 10
  2. typedef struct{
  3. ElemType *base; //存储空间基地址(数组首地址)
  4. int front; //队头
  5. int rear; //队尾
  6. }SqQueue;

在初始化创建空队列时,令front=rear=0(图a),每当插入新的元素时,队尾指针rear增1,每当删除队列头元素时,头指针front增1

当前队列分配的空间为5,当队列处于图(d)状态时不可再继续插入新元素,否则将会出现溢出现象,

即因为数组越界,可是此时队列并占未满,所以这种现象称为"假溢出"。

解决办法:

将顺序队列变为一个循环队列

头尾指针以及队列元素之间的关系不变,只是在队列中头 尾指针“依环增1”的操作可用“”运算来实现,通过取模,头指针和尾指针就可以在顺序表以头尾衔接的方式“循环”移动

但循环队列不能以头指针,尾指针的值是否相等来判断队列空间是 "满" 还是 "空".

解决办法:

      少用一个元素空间,及队列空间大小为m时,有m-1个元素就认为是满队。这样判断队空的条件不变,即当头尾指针的值相同时,则认为队空。

     而当尾指针在循环意义上加1后等于头指针,则认为队满

     因此在循环队列中队空队满的条件是:

          队空:Q.front==Q.rear

          队满:(Q.rear+1)%MAXSIZE==Q.front


操作完整代码:

  1. /*循环队列 基本操作:初始化、取队头元素、取队尾元素、判断队空、判断队满、入队、出队、求队列长度*/
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define OK 1
  5. #define ERROR 0
  6. #define LENGTH 10
  7. typedef int ElemType;
  8. typedef int Status;
  9. typedef struct SqQueue{
  10. ElemType *base; //初始化时动态分配存储空间
  11. int front;
  12. int rear;
  13. }SqQueue;
  14. /*Function:循环队列初始化*/
  15. Status Init_SqQueue(SqQueue *q){
  16. q->base=(ElemType *)malloc(LENGTH*sizeof(ElemType));//分配空间
  17. if(!q->base){
  18. return ERROR;
  19. }
  20. q->front=q->rear;
  21. printf("对初始化成功!\n");
  22. return OK;
  23. }
  24. /*Function:求循环队列长度*/
  25. int QueueLength(SqQueue q){
  26. return (q.rear-q.front+LENGTH)%LENGTH;
  27. }
  28. /*FUnction:入队*/
  29. Status EnQueue(SqQueue *q){
  30. ElemType e;
  31. if((q->rear+1)%LENGTH==q->front){
  32. return ERROR;
  33. }
  34. printf("请输入入队元素:\n");
  35. scanf("%d",&e);
  36. q->base[q->rear]=e;
  37. q->rear=(q->rear + 1) % LENGTH; //队尾指针加1
  38. printf("入队成功 \n");
  39. return OK;
  40. }
  41. /*function:出队*/
  42. Status OutQueue(SqQueue *q){
  43. if(q->front==q->rear){
  44. return ERROR;
  45. }
  46. printf("%d出队\n",q->base[q->front]);
  47. q->front++;
  48. return OK;
  49. }
  50. /*Function:取队头元素*/
  51. ElemType getQueueFront(SqQueue q){
  52. if(q.front!=q.rear){ //非空
  53. return q.base[q.front];
  54. }
  55. }
  56. /*Function:取队尾元素*/
  57. ElemType getQueueRear(SqQueue q){
  58. if(q.front!=q.rear){
  59. q.rear--;
  60. return q.base[q.rear];
  61. }
  62. }
  63. /*Function:判断队是否为空 */
  64. Status isEmpty(SqQueue q){
  65. if(q.front==q.rear){//为空
  66. return OK;
  67. }else{
  68. return ERROR;
  69. }
  70. }
  71. /*Function:判断队是否已满 */
  72. Status isFull(SqQueue q){
  73. if((q.rear+1)%LENGTH==q.front){//已满
  74. return OK;
  75. }else{
  76. return ERROR;
  77. }
  78. }
  79. void main(){
  80. SqQueue s;
  81. ElemType e;
  82. Init_SqQueue(&s);
  83. EnQueue(&s);
  84. EnQueue(&s);
  85. EnQueue(&s);
  86. OutQueue(&s);
  87. e=getQueueFront(s);
  88. printf("队头元素为:%d\n",e);
  89. e=getQueueRear(s);
  90. printf("队尾元素为:%d\n",e);
  91. if(isEmpty(s)){
  92. printf("队为空!\n");
  93. }else{
  94. printf("队非空!\n");
  95. }
  96. }

执行结果:

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

闽ICP备14008679号