当前位置:   article > 正文

顺序存储结构的队列(C语言)_c语言求顺序队列的长度

c语言求顺序队列的长度

队列是一种特殊的线性表,它的特殊性体现在,它只能够从一段进,从另一端出,遵循先入先出的原则。这种独特的规则,可以运用在程序设计中的很多地方,非常的巧妙。

下面,我用C语言来实现了循环队列

  1. /*******************************************************************/
  2. //描述:队列的顺序存储结构,该队列为循环队列,队列的创建,插入,删除等基本操作的函数,以及对这些操作进行验证
  3. //时间:2018.1.3 10:00
  4. //作者:Liu ZhenHua
  5. //*****************************************************************/
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #define OK 1
  9. #define ERROR 0
  10. #define TRUE 1
  11. #define FALSE 0
  12. #define MAXSIZE 5
  13. typedef int Status;
  14. typedef char QElement;
  15. typedef struct{
  16. QElement data[MAXSIZE];
  17. int front; //头指针
  18. int rear; //尾指针
  19. }SqQueue;
  20. Status InitQueue(SqQueue *Q); //初始化队列,头指针和尾指针都指向零
  21. int QueueLength(SqQueue *Q); //获取队列长度
  22. Status ENQueue(SqQueue *Q,QElement e); //在队列末尾插入新元素
  23. void PrintSQ(SqQueue *Q); //顺序打印队列中的元素
  24. Status DEQueue(SqQueue *Q,QElement *e); //出队列操作
  25. void printSL(void); //打印一行分割线
  26. int main()
  27. {
  28. SqQueue *SQ;QElement val,*pval=&val;
  29. SQ = (SqQueue*)malloc(sizeof(SqQueue));
  30. if(InitQueue(SQ))printf("队列初始化成功!\n"); //初始化队列
  31. printf("队列中有%d个元素\n",QueueLength(SQ)); //获取元素长度
  32. printSL();
  33. if(ENQueue(SQ,'a'))printf("插入元素%c成功!\n",'a'); //入队列
  34. if(ENQueue(SQ,'b'))printf("插入元素%c成功!\n",'b');
  35. if(ENQueue(SQ,'c'))printf("插入元素%c成功!\n",'c');
  36. if(ENQueue(SQ,'d'))printf("插入元素%c成功!\n",'d');
  37. printf("队列中有%d个元素\n",QueueLength(SQ));
  38. PrintSQ(SQ);
  39. printSL();
  40. if(DEQueue(SQ,pval))printf("出队列操作成功!\n"); //出队列
  41. if(DEQueue(SQ,pval))printf("出队列操作成功!\n"); //出队列
  42. PrintSQ(SQ);
  43. if(ENQueue(SQ,'x'))printf("插入元素%c成功!\n",'x'); //循环式入队列
  44. if(ENQueue(SQ,'x'))printf("插入元素%c成功!\n",'x'); //循环式入队列
  45. PrintSQ(SQ);
  46. printf("结束!\n");
  47. return 0;
  48. }
  49. /**********************************************/
  50. //函数名: InitQueue
  51. //描述 : 初始化队列指针
  52. //参数 :队列指针
  53. //返回值:状态值
  54. //作者 :LiuZhenHua
  55. /**********************************************/
  56. Status InitQueue(SqQueue *Q){
  57. Q->front = 0;
  58. Q->rear = 0;
  59. return OK;
  60. }
  61. /**********************************************/
  62. //函数名: QueueLength
  63. //描述 : 获取队列长度
  64. //参数 :队列指针
  65. //返回值:长度值
  66. //作者 :LiuZhenHua
  67. /**********************************************/
  68. int QueueLength(SqQueue *Q){
  69. int f,r;
  70. f = Q->front;
  71. r = Q->rear;
  72. if(r >= f){
  73. return r-f;
  74. }else{
  75. return (r + MAXSIZE - f);
  76. }
  77. }
  78. /**********************************************/
  79. //函数名: printSL
  80. //描述 : 打印一行分割线Print Split Line
  81. //参数 :结无
  82. //返回值:无
  83. //作者 :LiuZhenHua
  84. /**********************************************/
  85. void printSL(void){
  86. int i;
  87. for(i = 0; i < 20; i++){
  88. printf("-");
  89. }
  90. printf("\n");
  91. }
  92. /**********************************************/
  93. //函数名: ENQueue
  94. //描述 : 若队列未满,则插入元素e到队尾
  95. //参数 :结构体指针,插入元素
  96. //返回值:状态值
  97. //作者 :LiuZhenHua
  98. /**********************************************/
  99. Status ENQueue(SqQueue *Q,QElement e){
  100. int f,r;
  101. f = Q->front;
  102. r = Q->rear;
  103. if((r+1)%MAXSIZE == f){
  104. return ERROR; //队列已满
  105. }
  106. Q->data[r] = e;
  107. Q->rear = (r+1)%MAXSIZE;
  108. return OK;
  109. }
  110. /**********************************************/
  111. //函数名: PrintSQ
  112. //描述 : 打印队列中的元素
  113. //参数 :结构体指针
  114. //返回值:状态值
  115. //作者 :LiuZhenHua
  116. /**********************************************/
  117. void PrintSQ(SqQueue *Q){
  118. int f,i,length;
  119. f = Q->front;
  120. length = QueueLength(Q);
  121. if(QueueLength(Q)==0){
  122. printf("队列为空!\n");
  123. }else{
  124. printf("队列中有%d个元素。分别是:\n",QueueLength(Q));
  125. for(i = 0; i < length; i++){
  126. printf("data[%d] = %c\n",f,Q->data[f]);
  127. f = (f+1)%MAXSIZE;
  128. }
  129. }
  130. }
  131. /**********************************************/
  132. //函数名: DEQueue
  133. //描述 : 循环队列的出队列操作
  134. //参数 :结构体指针,数据指针
  135. //返回值:状态值
  136. //作者 :LiuZhenHua
  137. /**********************************************/
  138. Status DEQueue(SqQueue *Q,QElement *e){
  139. int length,f;
  140. f = Q->front;
  141. length = QueueLength(Q);
  142. if(length == 0){
  143. return ERROR;
  144. }
  145. *e = Q->data[f];
  146. Q->front=(f+1)%6; //头指针后移
  147. return OK;
  148. }


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

闽ICP备14008679号