用数组实现循环队列

#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#define N 10

typedef struct {
    int elements[N];
    int front;
    int rear;
    int size;
}Queue;

Queue* creat_queue();
void destory_queue(Queue* q);

void push_queue(Queue* q, int val);
int pop_queue(Queue* q);
int peek_queue(Queue* q);

bool is_empty(Queue* q);
bool is_full(Queue* q);

int main() {
    Queue* q = creat_queue();

    push_queue(q, 1);
    push_queue(q, 2);
    push_queue(q, 3);
    push_queue(q, 4);

    while (!is_empty(q)) {
        int ret = peek_queue(q);
        printf("%d ", ret);
        pop_queue(q);
    }

    printf("The queue is %s\n", is_empty(q) ? "empty" : "not empty");
    return 0;
}

Queue* creat_queue() {
    return calloc(1, sizeof(Queue));
}


void push_queue(Queue* q, int val) {
    //判满
    if (is_full(q)) {
        printf("Queue is full\n");
        exit(1);
    }
    q->elements[q->rear] = val;
    q->rear = (q->rear + 1) % N;
    q->size++;
}

int pop_queue(Queue* q) {
    //判空
    if (is_empty(q)) {
        printf("Queue is empty\n");
        exit(1);
    }
    int retVal = q->elements[q->front];
    q->front = (q->front + 1) % N;
    q->size--;
    return retVal;
}

int peek_queue(Queue* q) {
    //判空
    if (is_empty(q)) {
        printf("Queue is empty\n");
        exit(1);
    }
    return q->elements[q->front];
}

bool is_empty(Queue* q) {
    return q->size == 0;
}

bool is_full(Queue* q) {
    return q->size == N;
}