队列 - 数组实现
代码如下:
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 }