C实现队列

队列特点先进先出

队列声明

 

  1. #ifndef _ArrayQueue_h  
  2.   
  3. struct QueueRecord;  
  4. typedef struct QueueRecord *Queue;  
  5.   
  6. int IsEmpty(Queue Q);  
  7. int IsFull(Queue Q);  
  8. Queue CreateQueue(int MaxElements);  
  9. void DisposeQueue(Queue Q);  
  10. void MakeEmpty(Queue Q);  
  11. void Enqueue(int X, Queue Q);  
  12. int Front(Queue Q);  
  13. void Dequeue(Queue Q);  
  14. int FrontAndDequeue(Queue Q);  
  15.   
  16. #endif  


队列实现

 

 

  1. #include <stdio.h>    // stderr  
  2. #include <stdlib.h>   // NULL  
  3. #include "ArrayQueue.h"  
  4.   
  5. #define MinQueueSize (5)  
  6.   
  7. /* 队列的类型声明 */  
  8. struct QueueRecord  
  9. {  
  10.     int Capacity;  
  11.     int Front;  
  12.     int Rear;  
  13.     int Size;  
  14.     int *Array;  
  15. };  
  16.   
  17. /* 测试队列是否为空 */  
  18. int IsEmpty(Queue Q)  
  19. {     
  20.     return Q->Size == 0;  
  21. }  
  22.   
  23. /* 测试队列是否已满 */  
  24. int IsFull(Queue Q)  
  25. {     
  26.     return Q->Size == Q->Capacity;  
  27. }  
  28.   
  29. /* 队列的创建 数组实现 */  
  30. Queue CreateQueue(int MaxElements)  
  31. {  
  32.     Queue Q;  
  33.     if(MaxElements < MinQueueSize)  
  34.         fprintf(stderr, "Queue size is too small");  
  35.     Q = malloc(sizeof(struct QueueRecord));  
  36.     if(Q == NULL)  
  37.         fprintf(stderr, "Out of space");  
  38.     Q->Array = malloc(sizeof(int) * MaxElements);  
  39.     if(Q->Array == NULL)  
  40.         fprintf(stderr, "Out of space");  
  41.     Q->Capacity = MaxElements;  
  42.     MakeEmpty(Q);  
  43.       
  44.     return Q;  
  45. }  
  46.   
  47. /* 释放队列 */  
  48. void DisposeQueue(Queue Q)  
  49. {  
  50.     if(Q != NULL)  
  51.     {  
  52.         free(Q -> Array);  
  53.         free(Q);  
  54.     }  
  55. }  
  56.   
  57. /* 构造空队列 */  
  58. void MakeEmpty(Queue Q)  
  59. {  
  60.     Q->Size = 0;  
  61.     Q->Front = 1;  
  62.     Q->Rear = 0;  
  63. }  
  64.   
  65. /* 入队 */  
  66. static int Succ(int Value, Queue Q)  
  67. {  
  68.     if(++Value == Q->Capacity)  
  69.         Value = 0;  
  70.     return Value;  
  71. }  
  72.   
  73. void Enqueue(int X, Queue Q)  
  74. {  
  75.     if(IsFull(Q))  
  76.         fprintf(stderr, "Full queue");  
  77.     else  
  78.     {  
  79.         Q->Size++;  
  80.         Q->Rear = Succ(Q->Rear, Q);  
  81.         Q->Array[Q->Rear] = X;  
  82.     }  
  83. }  
  84.   
  85. /* 将队列头返回 */  
  86. int Front(Queue Q)  
  87. {  
  88.     if(!IsEmpty(Q))  
  89.         return Q->Array[Q->Front];  
  90.     fprintf(stderr, "Empty queue");  
  91.     return 0;  
  92. }  
  93.   
  94. /* 出队列 */  
  95. void Dequeue(Queue Q)  
  96. {  
  97.     if(IsEmpty(Q))  
  98.         fprintf(stderr, "Empty queue");  
  99.     else  
  100.     {  
  101.         Q->Size--;  
  102.         Q->Front = Succ(Q->Front, Q);       
  103.     }  
  104. }  
  105.   
  106. /* 将队列头元素返回并出队列 */  
  107. int FrontAndDequeue(Queue Q)  
  108. {     
  109.     int tmp;  
  110.     if(!IsEmpty(Q))  
  111.     {  
  112.             tmp = Q->Array[Q->Front];  
  113.             Q->Size--;  
  114.             Q->Front = Succ(Q->Front, Q);  
  115.             return tmp;  
  116.     }     
  117.     fprintf(stderr, "Empty queue");  
  118.     return 0;  
  119. }  


测试队列

 

 

  1. #include <stdio.h>  
  2. #include "ArrayQueue.h"  
  3.   
  4. int main(void)  
  5. {  
  6.     Queue q = CreateQueue(7);  
  7.       
  8.     Enqueue(10, q);  
  9.     Enqueue(22, q);  
  10.     Enqueue(1, q);  
  11.     Enqueue(32, q);  
  12.     Enqueue(56, q);  
  13.     Enqueue(6, q);  
  14.     Enqueue(78, q);  
  15.     printf("%d\n", FrontAndDequeue(q));  
  16.     printf("%d\n", Front(q));  
  17.     Dequeue(q);  
  18.     printf("%d\n", Front(q));  
  19.     Dequeue(q);  
  20.     printf("%d\n", Front(q));  
  21.     Dequeue(q);  
  22.     printf("%d\n", Front(q));  
  23.     Dequeue(q);  
  24.     printf("%d\n", Front(q));  
  25.     Dequeue(q);  
  26.     printf("%d\n", Front(q));  
  27.     Dequeue(q);  
  28.     printf("%d\n", Front(q));  
  29.     Dequeue(q);  
  30.   
  31.     return 0;  
  32. }  
posted @ 2014-01-01 16:28  刘俊鹏123  阅读(507)  评论(0编辑  收藏  举报
重生之大文豪