当前位置:   article > 正文

3.2数据结构之队列知识以及运算代码(循环队列,链队)_数据结构循环队列代码

数据结构循环队列代码

一.队列定义及性质

1.性质

(1)队列是一种运算受限的线性表,只能在队头进行删除操作,在队尾进行插入操作。

“先进先出”(可以用现实生活中的排队去思考)

(所以我们可以用对头和队尾来对队列进行操作)

 (2)空队列:队中没有元素时

2.结构类型

(1)使用顺序存储结构

  1. #include <stdio.h>
  2. #include<stdlib.h>
  3. #define MAXSIZE 1000
  4. typedef int Datatype;
  5. //队的顺序存储结构
  6. typedef struct{
  7. Datatype data[MAXSIZE];
  8. int front,rear;
  9. }SequenQueue;
  10. //front为对头指针,rear为队尾指针

(2)使用链式存储结构

  1. #include <stdio.h>
  2. #include<stdlib.h>
  3. #define MAXSIZE 1000
  4. typedef int Datatype;
  5. //链表
  6. typedef struct node{
  7. Datatype data;
  8. struct node *next;
  9. }LinkList;
  10. //链队列
  11. typedef struct{
  12. LinkList *front,*rear;
  13. }LinkQueue;

二.队列的运算

1.循环队列

由上图操作可以看出当入队时候会出现“假上溢”的情况,这时有大部分的空间都会被浪费掉。

为了解决空间浪费问题,有三种方法:

    (1)每次入队的时候都将队列整体向前移动一个位置,很像我们日常生活中的排队,前面有位置就向前移动。但是日常排队人数不会太多,在处理大量的数据时这种整体移动是很复杂麻烦的,效率也很低。

   (2)每当出现“假上溢”的情况,就把队列整体移动到初始位置。此时我们除了判断假上溢的情况外,还要进行移动,效率也很低。

    (3)运用循环队列解决。

 由上面两图可以看出,入队在队尾进行操作,队尾位置++,出队在队头进行操作,队头位置++;

循环队列的运算:

  1. #include <stdio.h>
  2. #include<stdlib.h>
  3. #define MAXSIZE 1000
  4. typedef int Datatype;
  5. typedef struct{
  6. Datatype data[MAXSIZE];
  7. int front,rear;
  8. }SequenQueue;
  9. //置空栈(初始化)SetNULLQ
  10. SequenQueue *SetNULLQ(SequenQueue *sq){
  11. sq = (SequenQueue *)malloc(sizeof(SequenQueue));
  12. sq->front=MAXSIZE-1;
  13. sq->rear=MAXSIZE-1;
  14. return sq;
  15. }
  16. //判断是否为空 EmptyQ
  17. Datatype EmptyQ(SequenQueue *sq){
  18. if(sq->front=sq->rear){
  19. return 1;
  20. }
  21. else{
  22. return 0;
  23. }
  24. }
  25. //取队头元素 FrontQ
  26. Datatype *FrontQ(SequenQueue *sq){
  27. Datatype *ret;
  28. if(EmptyQ(sq)){
  29. printf("为空队,没有队头元素");
  30. return NULL;
  31. }
  32. else{
  33. ret = (Datatype *)malloc(sizeof(Datatype));
  34. *ret = sq->data[(sq->front+1)%MAXSIZE];
  35. return ret;
  36. }
  37. }
  38. //元素入队 EnQueueQ
  39. int EnQueueQ(SequenQueue *sq,Datatype x){
  40. if((sq->rear+1)%MAXSIZE==sq->front){
  41. printf("队满,无法入队");
  42. return 0;
  43. }else{
  44. sq->rear=(sq->rear+1)%MAXSIZE;
  45. sq->data[sq->rear]=x;
  46. return 1;
  47. }
  48. }
  49. //出队并返回队头元素 DeQuenueQ
  50. Datatype *DeQuenueQ(SequenQueue *sq){
  51. Datatype *ret;
  52. if(EmptyQ(sq)){
  53. printf("为空队,没有队头元素");
  54. return NULL;
  55. }else{
  56. ret = (Datatype *)malloc(sizeof(Datatype));
  57. *ret = sq->data[(sq->front+1)%MAXSIZE];
  58. sq->front=(sq->front+1)%MAXSIZE;
  59. return ret;
  60. }
  61. }

 2.链队列

  1. #include <stdio.h>
  2. #include<stdlib.h>
  3. #define MAXSIZE 1000
  4. typedef int Datatype;
  5. //链表
  6. typedef struct node{
  7. Datatype data;
  8. struct node *next;
  9. }LinkList;
  10. //链队列
  11. typedef struct{
  12. LinkList *front,*rear;
  13. }LinkQueue;
  14. //置空队并初始化 SetNULLQ
  15. LinkQueue *SettNULLQ(LinkQueue *q){
  16. q = (LinkQueue *)malloc(sizeof(LinkQueue));
  17. q->front->next=NULL;
  18. q->rear=q->front;
  19. return q;
  20. }
  21. //判断空队 EmptyQ
  22. int EmptyQ(LinkQueue *q){
  23. if(q->front==q->rear)
  24. return 1;
  25. else
  26. return 0;
  27. }
  28. //取队头元素 FrontQ
  29. Datatype *FrontQ(LinkQueue *q){
  30. Datatype *ret;
  31. if(EmptyQ(q)){
  32. printf("队为空,没有队头元素");
  33. return NULL;
  34. }else{
  35. ret = (Datatype *)malloc(sizeof(Datatype));
  36. *ret = q->front->next->data;
  37. return ret;
  38. }
  39. }
  40. //入队 EnQuenueQ
  41. void EnQuenueQ(LinkQueue *q,Datatype x){
  42. q->rear->next = (LinkList *)malloc(sizeof(LinkList));
  43. q->rear=q->rear->next;
  44. q->rear->data=x;
  45. q->rear->next=NULL;
  46. }
  47. //出队 DeQuenueQ
  48. Datatype *DeQuenueQ(LinkQueue *q){
  49. Datatype *ret;
  50. LinkList *s;
  51. if(EmptyQ(q)){
  52. printf("队为空,没有队头元素");
  53. return NULL;
  54. }else{
  55. s = q->front->next;
  56. if(s->next=NULL){
  57. q->front->next=NULL;
  58. q->rear=q->front;
  59. }else{
  60. q->front->next=q->front->next->next;
  61. }
  62. ret = (Datatype *)malloc(sizeof(Datatype));
  63. *ret = s->data;
  64. free(s);
  65. return ret;
  66. }
  67. }

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

闽ICP备14008679号