循环队列

循环队列在普通队列的基础上,将队头与队尾相连,解决了队列假满的问题。

typedef struct {
    int front;
    int rear;
    int count;
    int data[QUEUE_MAX_SIZE];
}Queue;

void InitQueue(Queue *q) {
    memset(q, 0, sizeof(Queue));
}

int IsQueueEmpty(Queue *q) {
    return q->count == 0;
}

int IsQueueFull(Queue *q) {
    return q->count == QUEUE_MAX_SIZE;
}

int EnQueue(Queue *q, int x) {
    if (IsQueueFull(q)) return -1;
    q->data[q->rear] = x;
    q->count += 1;
    q->rear = (q->rear + 1) % QUEUE_MAX_SIZE;
    return 0;
}

int DeQueue(Queue *q, int *x) {
    if (IsQueueEmpty(q)) return -1;
    *x = q->data[q->front];
    q->count -= 1;
    q->front = (q->front + 1) % QUEUE_MAX_SIZE;
    return 0;
}

常数优化

在计算下标时,用到了效率不高的取余操作,如果将队列大小设为2的幂,那么可以将取余运算转化为位运算,提高效率。例如队列大小取128时,以下语句是等价的:

#define QUEUE_MAX_SIZE 128

q->rear = (q->rear + 1) % QUEUE_MAX_SIZE;
q->rear = (q->rear + 1) & (QUEUE_MAX_SIZE - 1);

q->front = (q->front + 1) % QUEUE_MAX_SIZE;
q->front = (q->front + 1) & (QUEUE_MAX_SIZE - 1);
Table of Contents