程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 循環隊列的實現

循環隊列的實現

編輯:關於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.     /* TODO (#2#): 構造空隊列 */ 
  34.     Q.base=(ElemType*)malloc(MAXQSIZE *sizeof(ElemType)); 
  35.     if(!Q.base)exit(OVERFLOW); 
  36.     QQ.front=Q.rear =0; 
  37.     return OK; //TODO: 替換這行代碼,以下同 
  38.     //.................................... 
  39.  
  40. //銷毀隊列Q  
  41. //  前提:隊列Q已存在  
  42. Status DestroyQueue(SqQueue &Q) 
  43.     /* TODO (#3#): 銷毀隊列 */ 
  44.     free(Q.base); 
  45.     Q.base=NULL; 
  46.     Q.front=0; 
  47.     Q.rear=0; 
  48.     return OK; 
  49.     //.................................... 
  50.  
  51. //將隊列Q清為空隊列 
  52. //  前提:隊列Q已存在 
  53. Status ClearQueue(SqQueue &Q) 
  54.     /* TODO (#4#): 清空隊列 */ 
  55.     Q.base=0; 
  56.     Q.rear=0; 
  57.     return OK; 
  58.     //.................................... 
  59.  
  60. //若隊列Q為空,則返回TRUE,否則FALSE  
  61. //  前提:隊列Q已存在 
  62. Status QueueEmpty(SqQueue Q) 
  63.     /* TODO (#5#): 判斷隊列是否為空 */ 
  64.     if(Q.front==Q.rear) 
  65.         return OK; 
  66.     else 
  67.         return ERROR; 
  68.     //.................................... 
  69.  
  70. //返回隊列Q的元素個數,即隊列長度 
  71. //  前提:隊列Q已存在  
  72. int QueueLength(SqQueue Q) 
  73.     /* TODO (#6#): 返回隊列長度 */ 
  74.     return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE; 
  75.     //.................................... 
  76.  
  77. //取隊列Q頭元素用e返回 
  78. //  前提:隊列Q存在且非空 
  79. Status GetHead(SqQueue Q,ElemType &e) 
  80.     /* TODO (#7#): 取隊頭元素存入e */ 
  81.     if(Q.rear==Q.front) 
  82.         return ERROR; 
  83.     e=Q.base[Q.front]; 
  84.     //e=*(Q.base+Q.front); 
  85.     return OK;//返回操作狀態(成功:OK,失敗:ERROR) 
  86.     //.................................... 
  87.  
  88. //插入元素e作為隊列Q的新的隊尾元素 
  89. //  前提:隊列Q存在且未滿 
  90. Status EnQueue(SqQueue &Q, ElemType e) 
  91.     /* TODO (#8#): 元素e入隊列 */ 
  92.     if((Q.rear+1)%MAXQSIZE==Q.front) 
  93.         return ERROR; 
  94.     //e=*(Q.base +Q.rear); 
  95.     Q.base[Q.rear]=e; 
  96.     Q.rear=(Q.rear+1)%MAXQSIZE; 
  97.     return OK;//返回操作狀態(成功:OK,失敗:ERROR) 
  98.     //.................................... 
  99.  
  100. //刪除隊列Q的隊頭元素,並用e返回  
  101. //  前提:隊列Q存在且非空  
  102. Status DeQueue(SqQueue &Q, ElemType e) 
  103.     /* TODO (#9#): 出隊列存入e */ 
  104.     if(Q.front==Q.rear) 
  105.         return ERROR; 
  106.     //e=*(Q.base+Q.front); 
  107.     e=Q.base[Q.front]; 
  108.     Q.front=(Q.front+1)%MAXQSIZE; 
  109.     return OK;//返回操作狀態(成功:OK,失敗:ERROR) 
  110.     //.................................... 
  111.  
  112. ////////////////////////////////////////// 
  113.  
  114.  
  115. //TODO: 定義好 SqQueue 類型後使用 QueueView 函數  
  116. /****** //TODO: 刪除此行以便使用QueueView() 
  117. #include <stdio.h> 
  118. //查看隊列狀態(調試用) 
  119. void QueueView(SqQueue Q) 
  120.    extern void PrintElem(ElemType e);//打印數據用  
  121.    int i=0; 
  122.    if(Q.front<0||Q.front>=MAXQSIZE||Q.rear<0||Q.rear>=MAXQSIZE){ 
  123.        printf("隊列未初始化\n");  
  124.        return ; 
  125.    } 
  126.    printf("---Queue View---\n"); 
  127.    printf("front=%d , rear=%d\n", Q.front, Q.rear); 
  128.    if(Q.rear>=Q.front) { 
  129.        printf(".....   ......\n"); 
  130.        for(i=Q.front; i<Q.rear; i++) { 
  131.            printf("%5d\t", i); 
  132.            PrintElem(Q.base[i]); 
  133.            printf("\n"); 
  134.        } 
  135.        if(i<MAXQSIZE) printf(".....   ......\n"); 
  136.    } else {        
  137.        for(i=0; i<Q.rear; i++) { 
  138.            printf("%5d\t", i); 
  139.            PrintElem(Q.base[i]); 
  140.            printf("\n"); 
  141.        } 
  142.        printf(".....   ......\n"); 
  143.        for(i=Q.front; i<MAXQSIZE; i++) { 
  144.            printf("%5d\t", i); 
  145.            PrintElem(Q.base[i]); 
  146.            printf("\n"); 
  147.        } 
  148.    } 
  149.    printf("--- view end ---\n"); 
  150. ******/ //TODO: 刪除此行以便使用QueueView() 
  151.  
  152. //取消ElemType的默認定義,以免影響其它部分  
  153. #ifdef USE_DEFAULT_ELEMTYPE 
  154. #undef ElemType 
  155. #undef USE_EFAULT_ELEMTYPE 
  156. #endif 
  157.  
  158. #endif //SQQUEUE_H_INCLUDED 
  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include "sqqueue.h" 
  4.  
  5. //初始化系統  
  6.  
  7.  
  8. void Finalize(SqQueue &q);    
  9.  
  10. //////////////////////////////////////////// 
  11. //主程序  
  12. int main() 
  13.     SqQueue q; //循環隊列  
  14.     int x;  
  15.      
  16.     //系統初始化 
  17.     InitQueue(q); 
  18.    printf("數據元素進隊列,以0結束"); 
  19.     scanf("%d",&x); 
  20.    while(x!=0){ 
  21.       EnQueue(q,x); 
  22.       scanf("%d",&x); 
  23.    } 
  24.    printf("\n隊列元素的個數"); 
  25.  
  26.    printf("%d",QueueLength(q)); 
  27.  
  28.  
  29.    printf("\n頭元素是:"); 
  30.    if(!QueueEmpty(q)){ 
  31.      if(GetHead(q,x)==OK) 
  32.       printf("%d",x); 
  33.    } 
  34.  
  35.  
  36.    printf("\n出隊列,先進先出"); 
  37.       if( DeQueue(q,x)==OK) 
  38.          printf("%d",x); 
  39.    printf("\n此時的對頭是:"); 
  40.    if(!QueueEmpty(q)){ 
  41.      if(GetHead(q,x)==OK) 
  42.       printf("%d\n",x); 
  43.    } 
  44.   

本文出自 “趙玉強的博客” 博客,請務必保留此出處http://zhaoyuqiang.blog.51cto.com/6328846/1179584

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved