#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100  // 定义队列的最大容量
typedef int ElemType;  // 定义队列元素类型

// 队列结构
typedef struct {
    ElemType data[MAX_SIZE];  // 存储队列元素的数组
    int front;  // 队头指针，指向队列中的第一个元素
    int rear;   // 队尾指针，指向队列中的最后一个元素的下一个位置
} Queue;

// 初始化队列
Queue * initQueue() {
	Queue *q;
	q = (Queue *)malloc(sizeof(Queue));
    q->front = 0;  // 队头指针初始化为0
    q->rear = 0;   // 队尾指针初始化为0
    return q;
}

// 判断队列是否为空
int isEmpty(Queue *q) {
    return q->front == q->rear;  // 队列为空时，队头和队尾指针相等
}

// 判断队列是否为满
int isFull(Queue *q) {
    return (q->rear + 1) % MAX_SIZE == q->front;  // 队列满时，队尾的下一个位置等于队头
}

// 入队操作
int enqueue(Queue *q, ElemType e) {
    if (isFull(q)) {
        printf("队列已满，无法入队\n");
        return 0;  // 如果队列满，返回失败
    }
    q->data[q->rear] = e;  // 将元素添加到队尾
    q->rear = (q->rear + 1) % MAX_SIZE;  // 更新队尾指针，确保循环使用
    return 1;  // 入队成功
}

// 出队操作
int dequeue(Queue *q, ElemType *e) {
    if (isEmpty(q)) {
        printf("队列为空，无法出队\n");
        return 0;  // 如果队列为空，返回失败
    }
    *e = q->data[q->front];  // 获取队头元素
    q->front = (q->front + 1) % MAX_SIZE;  // 更新队头指针，确保循环使用
    return 1;  // 出队成功
}

// 获取队头元素
ElemType getFront(Queue *q) {
    if (isEmpty(q)) {
        printf("队列为空\n");
        return -1;  // 如果队列为空，返回-1表示错误
    }
    return q->data[q->front];  // 返回队头元素
}

int main() {
    Queue *q;
    ElemType e;

    q = initQueue();  // 初始化队列

    // 测试入队
    enqueue(q, 10);
    enqueue(q, 20);
    enqueue(q, 30);
    enqueue(q, 40);
    enqueue(q, 50);

    // 尝试在队列满时再入队
    if (!enqueue(q, 60)) {
        printf("无法继续入队，队列已满\n");
    }

    // 测试出队
    dequeue(q, &e);
    printf("出队元素: %d\n", e);  // 输出出队的元素

    dequeue(q, &e);
    printf("出队元素: %d\n", e);  // 输出出队的元素

    // 获取队头元素
    printf("队头元素: %d\n", getFront(q));  // 输出队头元素

    return 0;
}