当前位置:   article > 正文

数据结构(C语言)——循环队列的基本操作_c语言 q.front = q.rear = 0;

c语言 q.front = q.rear = 0;

定义和结构

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<math.h>
  5. #include<iostream>
  6. #include<algorithm>//sort函数要用
  7. #define MAXSIZE 100
  8. #define ElemType int
  9. #define Status int
  10. enum TF{ERROR,OK};
  11. using namespace std;//与上面某些函数库搭配使用
  12. typedef struct
  13. {
  14. ElemType *base;
  15. int front;
  16. int rear;
  17. }SqQueue;

初始化

  1. Status InitQueue(SqQueue &Q)
  2. {
  3. Q.base=new ElemType[MAXSIZE];
  4. if(!Q.base)
  5. { printf("分配失败!"); exit(0);}
  6. Q.front=Q.rear=0;
  7. return OK;
  8. }

销毁队列和清空队列(不太清楚有什么区别就码一样了)

  1. Status DestroyQueue(SqQueue &Q)
  2. {
  3. if(Q.front==Q.rear)
  4. {
  5. printf("队空!\n");
  6. return ERROR;
  7. }
  8. Q.front=Q.rear=0;
  9. printf("队列已销毁!\n");
  10. return OK;
  11. }
  12. Status ClearQueue(SqQueue &Q)
  13. {
  14. if(Q.front==Q.rear)
  15. {
  16. printf("队空!\n");
  17. return ERROR;
  18. }
  19. Q.front=Q.rear=0;
  20. printf("队列已清空!\n");
  21. return OK;
  22. }

判断队是否为空

  1. bool QueueEmpty(SqQueue Q)
  2. {
  3. if(Q.rear==Q.front) return true;
  4. return false;
  5. }

求队列长度

(对于非循环队列,尾指针和头指针的差值就是队列长度,而对于循环队列来说,差值可能为负数,所以需要将差值加上MAXSIZE然后与MAXSIZE求余)

  1. int QueueLength(SqQueue Q)
  2. {
  3. return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
  4. }

取对头元素

  1. Status GetTop(SqQueue Q,ElemType &e)
  2. {
  3. if(Q.front==Q.rear)
  4. {
  5. printf("队空!\n");
  6. exit(0);
  7. }
  8. else
  9. e=Q.base[Q.rear-1];
  10. return OK;
  11. }

入队

  1. Status EnQueue(SqQueue &Q,ElemType e)
  2. {
  3. if((Q.rear+1)%MAXSIZE==Q.front)
  4. {
  5. printf("队列已满!");
  6. return ERROR;
  7. }
  8. else
  9. {
  10. Q.base[Q.rear]=e;
  11. Q.rear=(Q.rear+1)%MAXSIZE;
  12. return OK;
  13. }
  14. }

出队

  1. Status DeQueue(SqQueue &Q,ElemType &e)
  2. {
  3. if(Q.front==Q.rear)
  4. {
  5. printf("队空!\n");
  6. return ERROR;
  7. }
  8. e=Q.base[Q.rear-1];//注意
  9. Q.rear--;
  10. return OK;
  11. }

遍历队列

  1. Status QueueTraverse(SqQueue Q)
  2. {
  3. if(Q.front==Q.rear)
  4. {
  5. printf("队空!\n");
  6. return ERROR;
  7. }
  8. printf("队列元素:");
  9. for(int i=Q.front;i<Q.rear;i++)
  10. {
  11. printf("%d ",Q.base[i]);
  12. }
  13. printf("\n");
  14. return OK;
  15. }

打印队列元素

  1. void Print(SqQueue Q)
  2. {
  3. for(int i=Q.front;i<Q.rear;i++)
  4. {
  5. printf("%d ",Q.base[i]);
  6. }
  7. printf("\n");
  8. }

菜单

  1. void menu()
  2. {
  3. printf("********1.入队 2.出队*********\n");
  4. printf("********3.取队顶 4.清空队*******\n");
  5. printf("********5.遍历 6.销毁*********\n");
  6. printf("********7.队长度 8.退出*********\n");
  7. }

功能函数

  1. //以下是功能函数
  2. void enqueue(SqQueue &Q)
  3. {
  4. int n;
  5. ElemType e;
  6. int flag;
  7. printf("请输入入队元素个数(>=1):");
  8. scanf("%d",&n);
  9. for(int i=0;i<n;i++)
  10. {
  11. printf("请输入第%d个元素的值:",i+1);
  12. scanf("%d",&e);
  13. flag=EnQueue(Q,e);
  14. if(flag)printf("%d已入队\n",e);
  15. }
  16. printf("当前队列元素为:");
  17. Print(Q);
  18. }
  19. void dequeue(SqQueue &Q)
  20. {
  21. ElemType e;
  22. if(DeQueue(Q,e))
  23. {
  24. printf("出队元素为:%d\n",e);
  25. printf("剩余元素为:");
  26. Print(Q);
  27. }
  28. }
  29. void gettop(SqQueue &Q)
  30. {
  31. ElemType e;
  32. if(GetTop(Q,e))
  33. {
  34. printf("队顶元素为:%d\n",e);
  35. }
  36. }
  37. void queuelength(SqQueue &Q)
  38. {
  39. printf("队的长度为:%d\n",QueueLength(Q));
  40. printf("此时队的元素:");
  41. Print(Q);
  42. }

主函数

  1. int main()
  2. {
  3. SqQueue Q;
  4. InitQueue(Q);
  5. int choice;
  6. while(1)
  7. {
  8. menu();
  9. printf("请输入菜单号:");
  10. scanf("%d",&choice);
  11. if(choice==8) break;
  12. switch(choice)
  13. {
  14. case 1:enqueue(Q);break;
  15. case 2:dequeue(Q);break;
  16. case 3:gettop(Q);break;
  17. case 4:ClearQueue(Q);break;
  18. case 5:QueueTraverse(Q);break;
  19. case 6:DestroyQueue(Q);break;
  20. case 7:queuelength(Q);break;
  21. default:printf("输入错误!");
  22. }
  23. }
  24. return 0;
  25. }

代码整合

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<math.h>
  5. #include<iostream>
  6. #include<algorithm>//sort函数要用
  7. #define MAXSIZE 100
  8. #define ElemType int
  9. #define Status int
  10. enum TF{ERROR,OK};
  11. using namespace std;//与上面某些函数库搭配使用
  12. typedef struct
  13. {
  14. ElemType *base;
  15. int front;
  16. int rear;
  17. }SqQueue;
  18. Status InitQueue(SqQueue &Q)
  19. {
  20. Q.base=new ElemType[MAXSIZE];
  21. if(!Q.base)
  22. { printf("分配失败!"); exit(0);}
  23. Q.front=Q.rear=0;
  24. return OK;
  25. }
  26. Status DestroyQueue(SqQueue &Q)
  27. {
  28. if(Q.front==Q.rear)
  29. {
  30. printf("队空!\n");
  31. return ERROR;
  32. }
  33. Q.front=Q.rear=0;
  34. printf("队列已销毁!\n");
  35. return OK;
  36. }
  37. Status ClearQueue(SqQueue &Q)
  38. {
  39. if(Q.front==Q.rear)
  40. {
  41. printf("队空!\n");
  42. return ERROR;
  43. }
  44. Q.front=Q.rear=0;
  45. printf("队列已清空!\n");
  46. return OK;
  47. }
  48. bool QueueEmpty(SqQueue Q)
  49. {
  50. if(Q.rear==Q.front) return true;
  51. return false;
  52. }
  53. int QueueLength(SqQueue Q)
  54. {
  55. return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
  56. }
  57. Status GetTop(SqQueue Q,ElemType &e)
  58. {
  59. if(Q.front==Q.rear)
  60. {
  61. printf("队空!\n");
  62. exit(0);
  63. }
  64. else
  65. e=Q.base[Q.rear-1];
  66. return OK;
  67. }
  68. Status EnQueue(SqQueue &Q,ElemType e)
  69. {
  70. if((Q.rear+1)%MAXSIZE==Q.front)
  71. {
  72. printf("队列已满!");
  73. return ERROR;
  74. }
  75. else
  76. {
  77. Q.base[Q.rear]=e;
  78. Q.rear=(Q.rear+1)%MAXSIZE;
  79. return OK;
  80. }
  81. }
  82. Status DeQueue(SqQueue &Q,ElemType &e)
  83. {
  84. if(Q.front==Q.rear)
  85. {
  86. printf("队空!\n");
  87. return ERROR;
  88. }
  89. e=Q.base[Q.rear-1];//注意
  90. Q.rear--;
  91. return OK;
  92. }
  93. Status QueueTraverse(SqQueue Q)
  94. {
  95. if(Q.front==Q.rear)
  96. {
  97. printf("队空!\n");
  98. return ERROR;
  99. }
  100. printf("队列元素:");
  101. for(int i=Q.front;i<Q.rear;i++)
  102. {
  103. printf("%d ",Q.base[i]);
  104. }
  105. printf("\n");
  106. return OK;
  107. }
  108. void Print(SqQueue Q)
  109. {
  110. for(int i=Q.front;i<Q.rear;i++)
  111. {
  112. printf("%d ",Q.base[i]);
  113. }
  114. printf("\n");
  115. }
  116. void menu()
  117. {
  118. printf("********1.入队 2.出队*********\n");
  119. printf("********3.取队顶 4.清空队*******\n");
  120. printf("********5.遍历 6.销毁*********\n");
  121. printf("********7.队长度 8.退出*********\n");
  122. }
  123. //以下是功能函数
  124. void enqueue(SqQueue &Q)
  125. {
  126. int n;
  127. ElemType e;
  128. int flag;
  129. printf("请输入入队元素个数(>=1):");
  130. scanf("%d",&n);
  131. for(int i=0;i<n;i++)
  132. {
  133. printf("请输入第%d个元素的值:",i+1);
  134. scanf("%d",&e);
  135. flag=EnQueue(Q,e);
  136. if(flag)printf("%d已入队\n",e);
  137. }
  138. printf("当前队列元素为:");
  139. Print(Q);
  140. }
  141. void dequeue(SqQueue &Q)
  142. {
  143. ElemType e;
  144. if(DeQueue(Q,e))
  145. {
  146. printf("出队元素为:%d\n",e);
  147. printf("剩余元素为:");
  148. Print(Q);
  149. }
  150. }
  151. void gettop(SqQueue &Q)
  152. {
  153. ElemType e;
  154. if(GetTop(Q,e))
  155. {
  156. printf("队顶元素为:%d\n",e);
  157. }
  158. }
  159. void queuelength(SqQueue &Q)
  160. {
  161. printf("队的长度为:%d\n",QueueLength(Q));
  162. printf("此时队的元素:");
  163. Print(Q);
  164. }
  165. int main()
  166. {
  167. SqQueue Q;
  168. InitQueue(Q);
  169. int choice;
  170. while(1)
  171. {
  172. menu();
  173. printf("请输入菜单号:");
  174. scanf("%d",&choice);
  175. if(choice==8) break;
  176. switch(choice)
  177. {
  178. case 1:enqueue(Q);break;
  179. case 2:dequeue(Q);break;
  180. case 3:gettop(Q);break;
  181. case 4:ClearQueue(Q);break;
  182. case 5:QueueTraverse(Q);break;
  183. case 6:DestroyQueue(Q);break;
  184. case 7:queuelength(Q);break;
  185. default:printf("输入错误!");
  186. }
  187. }
  188. return 0;
  189. }

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

闽ICP备14008679号