队列 - 数组实现

代码如下:

  1 #include <cstdio>
  2 #include <cstdlib>
  3 
  4 typedef int itemType;
  5 typedef struct QueueRecord* queue;
  6 
  7 /* 对于size大小的数组,如果没有额外的变量记录大小,而仅仅通过front和rear,则我们
  8  * 只能表示0~size-1个数值。0和size没法同时用front和rear的运算表示。所以我们空出 
  9  * 数组的一个位置。本代码采用front所在的位置始终为空的实现方式。 
 10  */
 11 struct QueueRecord
 12 {
 13     int capacity;
 14     int front;
 15     int rear;
 16     itemType* item;
 17 };
 18 
 19 int
 20 Succ(int index, queue q)
 21 {
 22     if (++index == q->capacity) {
 23         index = 0;
 24     }
 25     return index;
 26 }
 27 
 28 int
 29 IsEmpty(queue q)
 30 {
 31     return q->front == q->rear;
 32 }
 33 
 34 int
 35 IsFull(queue q)
 36 {
 37     return Succ(q->rear, q) == q->front;
 38 }
 39 
 40 void
 41 MakeEmpty(queue q)
 42 {
 43     q->front = 0;
 44     q->rear = 0;
 45 }
 46 
 47 void
 48 Pop(queue q)
 49 {
 50     if (!IsEmpty(q)) {
 51         q->front = Succ(q->front, q);
 52     }
 53 }
 54 
 55 itemType
 56 Top(queue q)
 57 {
 58     if (!IsEmpty(q)) {
 59         return q->item[Succ(q->front, q)];
 60     } else {
 61         printf("Queue is empty!\n");
 62         return -1;
 63     }
 64 }
 65 
 66 void
 67 Push(itemType x, queue q)
 68 {
 69     if (IsFull(q)) {
 70         printf("Queue is full!\n"); 
 71     } else {
 72         q->rear = Succ(q->rear, q);
 73         q->item[q->rear] = x;
 74     }
 75 }
 76 
 77 queue
 78 CreateQueue(int maxSize)
 79 {
 80     queue q;
 81     
 82     q = (queue)malloc(sizeof(struct QueueRecord));
 83     if (q == NULL) {
 84         printf("out of space!\n");
 85         return NULL;
 86     }
 87     
 88     q->item = (itemType*)malloc(sizeof(itemType) * (maxSize+1));
 89     
 90     q->front = 0;
 91     q->rear = 0;
 92     q->capacity = maxSize+1;
 93     
 94     MakeEmpty(q);
 95     return q;
 96 }
 97 
 98 void
 99 DisposeQueue(queue q)
100 {
101     if (q != NULL) {
102         free(q->item);
103         free(q);
104     }
105 }
106 
107 int
108 main(int argc, char** argv)
109 {
110     queue q;
111     
112     q = CreateQueue(3);
113     Push(2, q);
114     Push(3, q);
115     Push(4, q);
116     Pop(q);
117     Pop(q);
118     Pop(q);
119 
120     printf("%d\n", Top(q));
121     
122     DisposeQueue(q);
123     q = NULL;
124     
125     system("pause");
126     return(0);
127 }

 

posted @ 2014-11-04 20:29  nipan  阅读(190)  评论(0编辑  收藏  举报