当前位置:   article > 正文

队列的顺序存储结构和链式存储结构_队列顺序,链式存储结构

队列顺序,链式存储结构

        队列也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。

一、队列的顺序存储形式

一般队列的顺序存储结构运用的是循环队列,在编写程序之前,需要了解循环队列的相关计算。

初始时:Q.front=Q.rear=0

队空条件:Q.front==Q.rear

队满条件:(Q.rear+1)%MaxSize==Q.front

队头指针进1:Q.front=(Q.front+1)%MaxSize

队尾指针进1:Q.rear=(Q.rear+1)%MaxSize

队列长度:(Q.rear-Q.front+MaxSize)%MaxSize

基础代码如下所示:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define MaxSize 50
  4. typedef struct //队列的顺序存储结构
  5. {
  6. int data[MaxSize]; //存放队列元素
  7. int front, rear; //队头指针和队尾指针
  8. }SqQueue;
  9. void Init(SqQueue& Q) //初始化队列
  10. {
  11. Q.front = Q.rear = 0; //是0不是空
  12. }
  13. bool IsEmpty(SqQueue Q) //判队空
  14. {
  15. if (Q.front == Q.rear)
  16. return true;
  17. else
  18. return false;
  19. }
  20. bool Enter(SqQueue& Q, int x) //入队
  21. {
  22. if ((Q.rear + 1) % MaxSize == Q.front) //判断队列是否为满
  23. return false;
  24. Q.data[Q.rear] = x;
  25. Q.rear = (Q.rear + 1) % MaxSize;
  26. return true;
  27. }
  28. bool Out(SqQueue& Q) //出队
  29. {
  30. if (Q.front == Q.rear) //判断队列是否为空
  31. return false;
  32. int x = Q.data[Q.front];
  33. printf("%4d", x);
  34. Q.front = (Q.front + 1) % MaxSize;
  35. return true;
  36. }
  37. int main() {
  38. SqQueue Q;
  39. Init(Q);
  40. int x=0,i=0;
  41. printf("输入一串数据,以“-99999”结束:");
  42. while (x != -99999) {
  43. scanf_s("%d", &x);
  44. Enter(Q, x);
  45. i++; //i记录队列中数据元素个数
  46. }
  47. printf("\n出队:");
  48. for(int j=0;j<i-1;j++) //队列中的数据依次出队
  49. Out(Q);
  50. }

结果如下:

 

二、队列的链式存储结构

队列的链式存储结构的主要思想,正是带表头结点的单链表

与顺序存储不一样的是:

顺序存储中,front指向第一个值,而rear指向最后一个值的后一个位置;

链式存储中,front指向头结点,rear指向最后一个结点。

以下简单地给出队列链式存储的初始化,判队空,进出队的操作。

基础代码如下:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct LinkNode //链式队列结点
  4. {
  5. int data;
  6. struct LinkNode* next;
  7. }LinkNode;
  8. typedef struct //链式队列
  9. {
  10. LinkNode* front, * rear;
  11. }LinkQueue;
  12. void Init(LinkQueue &Q) //队列初始化
  13. {
  14. Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode)); //创建头结点
  15. Q.front->next = NULL;
  16. }
  17. bool IsEmpty(LinkQueue Q) //判队空
  18. {
  19. if (Q.front == Q.rear)
  20. return false;
  21. else
  22. return true;
  23. }
  24. void Enter(LinkQueue& Q,int x) //入队
  25. {
  26. LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
  27. s->data = x; s->next = NULL;
  28. Q.rear->next = s;
  29. Q.rear = s;
  30. }
  31. bool Out(LinkQueue& Q) //出队
  32. {
  33. if (Q.front == Q.rear)
  34. return false;
  35. LinkNode* p = Q.front->next;
  36. int x = p->data;
  37. printf("%4d", x);
  38. Q.front->next = p->next;
  39. if (Q.rear == p) //若队列中只有一个结点,删除后变空
  40. Q.rear = Q.front;
  41. free(p);
  42. return true;
  43. }
  44. int main() {
  45. LinkQueue Q;
  46. Init(Q);
  47. int x=0,i=0;
  48. printf("输入一串数据,以“-99999”结束:");
  49. while (x != -99999) {
  50. scanf_s("%d", &x);
  51. Enter(Q, x);
  52. i++; //i记录队列中数据元素个数
  53. }
  54. printf("\n出队:");
  55. for(int j=0;j<i-1;j++) //队列中的数据依次出队
  56. Out(Q);
  57. }

结果如下:

 

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

闽ICP备14008679号