#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 10
typedef struct {
int data[MAX_SIZE]; // 存储队列元素的数组
int front; // 队列头指针
int rear; // 队列尾指针
} Queue;
// 初始化队列
void initQueue(Queue* queue) {
queue->front = -1; // 队列头初始位置设置为-1
queue->rear = -1; // 队列尾初始位置设置为-1
}
// 判断队列是否已满
bool isFull(const Queue* queue) {
// 队列满的条件是front在队列开头并且rear在队列末尾,或者front在rear的下一个位置
return (queue->front == 0 && queue->rear == MAX_SIZE - 1) ||
(queue->front == queue->rear + 1);
}
// 判断队列是否为空
bool isEmpty(const Queue* queue) {
// 队列空的条件是front为-1
return queue->front == -1;
}
// 入队操作
void enqueue(Queue* queue, int value) {
if (isFull(queue)) {
printf("队列已满,无法入队 %d\n", value);
return;
}
// 如果队列为空,设置头指针为0
if (queue->front == -1) {
queue->front = 0;
}
// 循环队列,更新rear指针
queue->rear = (queue->rear + 1) % MAX_SIZE;
queue->data[queue->rear] = value; // 将元素放入队列尾部
}
// 出队操作
int dequeue(Queue* queue) {
if (isEmpty(queue)) {
printf("队列为空,无法出队\n");
return -1;
}
int value = queue->data[queue->front]; // 获取队头元素的值
if (queue->front == queue->rear) {
// 队列中只有一个元素,将头尾指针恢复到初始状态
queue->front = -1;
queue->rear = -1;
} else {
// 循环队列,更新front指针
queue->front = (queue->front + 1) % MAX_SIZE;
}
return value;
}
int main() {
Queue queue;
initQueue(&queue); // 初始化队列
// 入队操作
enqueue(&queue, 10);
enqueue(&queue, 20);
enqueue(&queue, 30);
enqueue(&queue, 40);
// 出队操作
printf("出队元素: %d\n", dequeue(&queue));
printf("出队元素: %d\n", dequeue(&queue));
// 继续入队操作
enqueue(&queue, 50);
enqueue(&queue, 60);
// 出队所有剩余元素
while (!isEmpty(&queue)) {
printf("出队元素: %d\n", dequeue(&queue));
}
return 0;
}
这是一个简单的循环队列的演示,使用了一个固定大小的数组来存储队列元素。请注意,在真实的应用中,您可能需要添加更多的错误处理和安全检查来处理边界情况,或者如果需要一个大小可变的队列,则需要动态调整队列大小。