国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

如何實現循環隊列

2020-05-23 14:17:25
字體:
來源:轉載
供稿:網友

本文主要介紹了C語言循環隊列的實現,對于數據結構與算法的研究有所幫助,需要的朋友可以參考下

生活中有很多隊列的影子,比如打飯排隊,買火車票排隊問題等,可以說與時間相關的問題,一般都會涉及到隊列問題;從生活中,可以抽象出隊列的概念,隊列就是一個能夠實現“先進先出”的存儲結構。隊列分為鏈式隊列和靜態隊列;靜態隊列一般用數組來實現,但此時的隊列必須是循環隊列,否則會造成巨大的內存浪費;鏈式隊列是用鏈表來實現隊列的。

 

 
  1. #ifndef SQQUEUE_H_INCLUDED  
  2. #define SQQUEUE_H_INCLUDED /* 防止重復包含 */  
  3.  
  4. //////////////////////////////////////////  
  5. //包含頭文件  
  6. #include <stdlib.h>  
  7. #include "ds.h" // OK, Status 等定義  
  8.  
  9. //數據元素的類型(缺省使用int型)  
  10. #ifndef ElemType  
  11. #define ElemType int  
  12. #define USE_DEFAULT_ELEMTYPE /* 使用缺省類型的標志 */  
  13. #endif //ElemType  
  14.  
  15. //////////////////////////////////////////  
  16. //循環隊列的存儲結構  
  17.  
  18. #define MAXQSIZE 500/* 循環隊列的最大容量 */  
  19. typedef struct {  
  20. /* TODO (#1#): 這里完成循環隊列的類型定義 */ 
  21. ElemType *base;  
  22. int front;  
  23. int rear;  
  24. //....................................  
  25. } SqQueue;  
  26.  
  27.  
  28. //////////////////////////////////////////  
  29. //循環隊列的基本操作  
  30.  
  31. //構造一個空隊列Q  
  32. Status InitQueue(SqQueue &Q)  
  33. {  
  34. /* TODO (#2#): 構造空隊列 */ 
  35. Q.base=(ElemType*)malloc(MAXQSIZE *sizeof(ElemType));  
  36. if(!Q.base)exit(OVERFLOW);  
  37. QQ.front=Q.rear =0;  
  38. return OK; //TODO: 替換這行代碼,以下同  
  39. //....................................  
  40. }  
  41.  
  42. //銷毀隊列Q  
  43. // 前提:隊列Q已存在  
  44. Status DestroyQueue(SqQueue &Q)  
  45. {  
  46. /* TODO (#3#): 銷毀隊列 */ 
  47. free(Q.base);  
  48. Q.base=NULL;  
  49. Q.front=0;  
  50. Q.rear=0;  
  51. return OK;  
  52. //....................................  
  53. }  
  54.  
  55. //將隊列Q清為空隊列  
  56. // 前提:隊列Q已存在  
  57. Status ClearQueue(SqQueue &Q)  
  58. {  
  59. /* TODO (#4#): 清空隊列 */ 
  60. Q.base=0;  
  61. Q.rear=0;  
  62. return OK;  
  63. //....................................  
  64. }  
  65.  
  66. //若隊列Q為空,則返回TRUE,否則FALSE  
  67. // 前提:隊列Q已存在  
  68. Status QueueEmpty(SqQueue Q)  
  69. {  
  70. /* TODO (#5#): 判斷隊列是否為空 */ 
  71. if(Q.front==Q.rear)  
  72. return OK;  
  73. else 
  74. return ERROR;  
  75. //....................................  
  76. }  
  77.  
  78. //返回隊列Q的元素個數,即隊列長度  
  79. // 前提:隊列Q已存在  
  80. int QueueLength(SqQueue Q)  
  81. {  
  82. /* TODO (#6#): 返回隊列長度 */ 
  83. return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;  
  84. //....................................  
  85. }  
  86.  
  87. //取隊列Q頭元素用e返回  
  88. // 前提:隊列Q存在且非空  
  89. Status GetHead(SqQueue Q,ElemType &e)  
  90. {  
  91. /* TODO (#7#): 取隊頭元素存入e */ 
  92. if(Q.rear==Q.front)  
  93. return ERROR;  
  94. e=Q.base[Q.front];  
  95. //e=*(Q.base+Q.front);  
  96. return OK;//返回操作狀態(成功:OK,失敗:ERROR)  
  97. //....................................  
  98. }  
  99.  
  100. //插入元素e作為隊列Q的新的隊尾元素  
  101. // 前提:隊列Q存在且未滿  
  102. Status EnQueue(SqQueue &Q, ElemType e)  
  103. {  
  104. /* TODO (#8#): 元素e入隊列 */ 
  105. if((Q.rear+1)%MAXQSIZE==Q.front)  
  106. return ERROR;  
  107. //e=*(Q.base +Q.rear);  
  108. Q.base[Q.rear]=e;  
  109. Q.rear=(Q.rear+1)%MAXQSIZE;  
  110. return OK;//返回操作狀態(成功:OK,失敗:ERROR)  
  111. //....................................  
  112. }  
  113.  
  114. //刪除隊列Q的隊頭元素,并用e返回  
  115. // 前提:隊列Q存在且非空  
  116. Status DeQueue(SqQueue &Q, ElemType e)  
  117. {  
  118. /* TODO (#9#): 出隊列存入e */ 
  119. if(Q.front==Q.rear)  
  120. return ERROR;  
  121. //e=*(Q.base+Q.front);  
  122. e=Q.base[Q.front];  
  123. Q.front=(Q.front+1)%MAXQSIZE;  
  124. return OK;//返回操作狀態(成功:OK,失敗:ERROR)  
  125. //....................................  
  126. }  
  127.  
  128. //////////////////////////////////////////  
  129.  
  130.  
  131. //TODO: 定義好 SqQueue 類型后使用 QueueView 函數  
  132. /****** //TODO: 刪除此行以便使用QueueView()  
  133. #include <stdio.h>  
  134. //查看隊列狀態(調試用)  
  135. void QueueView(SqQueue Q)  
  136.  
  137. extern void PrintElem(ElemType e);//打印數據用  
  138. int i=0;  
  139. if(Q.front<0||Q.front>=MAXQSIZE||Q.rear<0||Q.rear>=MAXQSIZE){  
  140. printf("隊列未初始化/n");  
  141. return ;  
  142.  
  143. printf("---Queue View---/n");  
  144. printf("front=%d , rear=%d/n", Q.front, Q.rear);  
  145. if(Q.rear>=Q.front) {  
  146. printf("..... ....../n");  
  147. for(i=Q.front; i<Q.rear; i++) {  
  148. printf("%5d/t", i);  
  149. PrintElem(Q.base[i]);  
  150. printf("/n");  
  151.  
  152. if(i<MAXQSIZE) printf("..... ....../n");  
  153. } else {  
  154. for(i=0; i<Q.rear; i++) {  
  155. printf("%5d/t", i);  
  156. PrintElem(Q.base[i]);  
  157. printf("/n");  
  158.  
  159. printf("..... ....../n");  
  160. for(i=Q.front; i<MAXQSIZE; i++) {  
  161. printf("%5d/t", i);  
  162. PrintElem(Q.base[i]);  
  163. printf("/n");  
  164.  
  165.  
  166. printf("--- view end ---/n");  
  167.  
  168. ******/ //TODO: 刪除此行以便使用QueueView()  
  169.  
  170. //取消ElemType的默認定義,以免影響其它部分  
  171. #ifdef USE_DEFAULT_ELEMTYPE  
  172. #undef ElemType  
  173. #undef USE_EFAULT_ELEMTYPE  
  174. #endif  
  175.  
  176. #endif //SQQUEUE_H_INCLUDED  
  177.  
  178. #include <stdio.h>  
  179. #include <stdlib.h>  
  180. #include "sqqueue.h"  
  181.  
  182. //初始化系統  
  183.  
  184.  
  185. void Finalize(SqQueue &q);  
  186.  
  187. ////////////////////////////////////////////  
  188. //主程序  
  189. int main()  
  190. {  
  191. SqQueue q; //循環隊列  
  192. int x;  
  193.  
  194. //系統初始化  
  195. InitQueue(q);  
  196. printf("數據元素進隊列,以0結束");  
  197. scanf("%d",&x);  
  198. while(x!=0){  
  199. EnQueue(q,x);  
  200. scanf("%d",&x);  
  201. }  
  202. printf("/n隊列元素的個數");  
  203.  
  204. printf("%d",QueueLength(q));  
  205.  
  206.  
  207. printf("/n頭元素是:");  
  208. if(!QueueEmpty(q)){  
  209. if(GetHead(q,x)==OK)  
  210. printf("%d",x);  
  211. }  
  212.  
  213.  
  214. printf("/n出隊列,先進先出");  
  215. if( DeQueue(q,x)==OK)  
  216. printf("%d",x);  
  217. printf("/n此時的對頭是:");  
  218. if(!QueueEmpty(q)){  
  219. if(GetHead(q,x)==OK)  
  220. printf("%d/n",x);  
  221. }  
  222.  
  223. }  

實現的效果:

如何實現循環隊列

以上所述就是本文的全部內容了,希望大家能夠理解。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 忻州市| 枣庄市| 盘锦市| 伊川县| 改则县| 嘉兴市| 朔州市| 昆明市| 长春市| 黔西| 阳信县| 昌黎县| 抚远县| 安徽省| 林甸县| 新绛县| 红安县| 绥阳县| 梁平县| 吉水县| 红安县| 南京市| 温州市| 南安市| 封丘县| 洪江市| 华宁县| 赤峰市| 宣城市| 娄底市| 绥宁县| 韶关市| 云浮市| 句容市| 福州市| 龙门县| 阿克| 西乌| 富源县| 达州市| 崇义县|