rear++; L->data[L->rear]=x;(需要入队的元素) 出队操作:L->front++; x=L->data[L->front]; 求队长:队长=(L->rear)-(L->front);..._循环队列入队出队c语言">
当前位置:   article > 正文

顺序循环队列的基本操作(C语言实现)_循环队列入队出队c语言

循环队列入队出队c语言

一、队列和循环队列基本概念

队列:

  • 和栈相反,队列是一种先进先出(FIFO)的线性表。只允许在一端插入,在另一端删除。
  • 允许插入的叫"队尾"(rear),允许删除的叫"队头"(front)。

  • 入队操作:L->rear++;   L->data[L->rear]=x;(需要入队的元素)

  • 出队操作:L->front++;  x=L->data[L->front];

  • 求队长:队长=(L->rear)-(L->front);

  • 队空:L->rear==L->front==-1;

  • 队满:队长=max

  • 使用场景:一切具备先来后到的任务场景

 

循环队列:

 

  •  和队列类似,只不过队头和队尾相连,解决了队列的假溢出现象(队尾指针达到申请空间的最大时,系统会认定空间满,但是队头指针如果不为-1则就是假溢出)。
  • 入队:L->rear==(L->rear+1)%max;
  • 出队:L->front==(L->front+1)%max;
  • 队满:由图可知 队满和队空条件重复,所以为了避免这一情况现如今有两种方法:1.少用一个元素空间,也就是说front指针在定义时指向0的位置,这样才能使front和rear之间空出一个元素空间。2.这个方法比较容易理解,就是定义一个Num值来记录元素个数,num==0时则队空,num==max时则队满。

具体操作:(L->rear+1)%max==front;  num==max;

  • 队空:L->rear==L->front;
  • 队长:分两种情况:1.头指针在尾指针之后:按普通队列求法。2.头指针在尾指针之前:队长=L->rear+(max-(L->front));

二、代码实操

 图示:

 

 具体代码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #define ture 1
  5. #define false 0
  6. #define max 5
  7. typedef struct {
  8. int data[max];
  9. int front,rear;
  10. }cteam,*team;
  11. static int num=0; //全局变量 num
  12. //初始队列
  13. int Initteam(team &L){
  14. L=(cteam *)malloc(sizeof(cteam));
  15. if(L==NULL){
  16. printf("申请空间失败!");
  17. return false;
  18. }
  19. L->front=L->rear=-1;
  20. return true;
  21. }
  22. //入队
  23. int pushteam(team &L,int x){
  24. if(num==max){
  25. printf("队满");
  26. return false;
  27. }else{
  28. L->rear=(L->rear+1)%max; //rear始终在0-10中循环
  29. L->data[L->rear]=x;
  30. num++;
  31. return true;
  32. }
  33. }
  34. //出队
  35. int popteam(team &L,int &x){
  36. if(num==0){
  37. printf("队空!");
  38. return false;
  39. }else{
  40. L->front=(L->front+1)%max; //front始终在0-10中循环
  41. x=L->data[L->front];
  42. num--;
  43. printf("\n%d出队\n",x);
  44. return x;
  45. }
  46. }
  47. //遍历队
  48. void printteam(team L){
  49. int p;
  50. p=L->front+1;
  51. if(L->front<L->rear){
  52. while(p<=L->rear){
  53. printf("%d ",L->data[p]);
  54. p++;}
  55. }else{
  56. while((p-1)!=L->rear){
  57. printf("%d ",L->data[p]);
  58. p=(p+1)%max;
  59. }
  60. }
  61. }
  62. //求队长
  63. int teamlength(team L){
  64. int p;
  65. if(L->front<L->rear){
  66. p=(L->rear)-(L->front); //当队列正常时
  67. }else{
  68. p=L->rear+(max-(L->front)); //当队列开始循环时
  69. }
  70. printf("\n队长为:%d",p);
  71. }
  72. //取队头元素
  73. int gettop(team L){
  74. if(L->front==L->rear){
  75. printf("队空!");
  76. return false;
  77. }else{
  78. int t=L->data[L->front+1];
  79. return t;
  80. }
  81. }
  82. /*
  83. pushteam:入队函数 popteam:出队函数
  84. printteam:遍历函数 gettop:取队头函数
  85. Initteam:初始化函数 teamlength:求队长函数
  86. */
  87. int main(){
  88. team s;
  89. int w;
  90. Initteam(s);
  91. //1-3进队列
  92. pushteam(s,1);
  93. pushteam(s,2);
  94. pushteam(s,3);
  95. printf("------1-3进队列后----------\n");
  96. printf("此时队列为:");
  97. printteam(s);
  98. popteam(s,w);
  99. popteam(s,w);
  100. printf("此时队列为:");
  101. printteam(s);
  102. printf("\n------4-6进队列后----------\n");
  103. pushteam(s,4);
  104. pushteam(s,5);
  105. pushteam(s,6);
  106. printf("此时队列为:");
  107. printteam(s);
  108. teamlength(s);
  109. int T=gettop(s);
  110. printf("\n队头元素为:%d",T);
  111. }

实现结果:

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号