队列也可以用顺序存储表示。定义还是一样的:从队尾rear推入元素。从头部head拿出元素,是FIFO。
与链式存储一致,我们仍然需要附设两个指针front和rear分别表示队列头元素和队列元素的位置。初始时front=rear=0是队列空的条件。
每当插入新的队列元素时,尾指针将增1.删除队列头元素时,头指针增加1。即非空队列中:头元素总是指向队首元素,而尾指针总是指向队尾元素的下一个位置。
除了基本的顺序存储外,我们还可以使用循环数组来构造一个循环队列。
在循环队列中,上述head+1,rear+1变为(head+1)%MAX, (rear+1)%MAX。
队列空的条件还是head==rear,但是满的条件变为(rear+1)%MAX==head。为了这个Full的判断,循环队列将浪费一个空间,即可使用的空间只有MAX-1个。
代码如下:
#include <stdio.h> #define MAX 1000 struct Queue { int data[MAX]; int head; int rear; }; void queue_init(struct Queue* q) { q->head = q->rear = 0; } int queue_is_empty(struct Queue* q) { if(q->head==q->rear) { return 1; }else { return 0; } } int queue_is_full(struct Queue* q) { if((q->rear+1)%MAX==q->head) { return 1; }else { return 0; } } int queue_enqueue(struct Queue* q, int data) { if(queue_is_full(q)) { return -1; } q->data[q->rear] = data; q->rear = (q->rear+1) % MAX; } int queue_dequeue(struct Queue* q, int* data) { if(queue_is_empty(q)) { return -1; } *data = q->data[q->head]; q->head = (q->head+1) % MAX; } int queue_print(struct Queue* q) { int i; for(i=q->head;i!=q->rear;i=(i+1)%MAX) { printf("%d ", q->data[i]); } printf("\n"); } int main() { struct Queue q; int i; int data; queue_init(&q); // Would left 999 not enqueue for(i=0;i<1000;i++) { queue_enqueue(&q, i); } for(i=0;i<10;i++) { queue_dequeue(&q, &data); } for(i=0;i<10;i++) { queue_enqueue(&q, i); } printf("IsFull:%d\n", queue_is_full(&q)); queue_print(&q); return 0; }