能否提供C语言实现的环形队列(Circular Queue)的基本操作算法,包括入队(enqueue)、出队(dequeue)和查看队首元素(front)等?
时间: 2024-10-21 11:14:42 浏览: 54
当然可以。环形队列是一种特殊的线性表,它的头部和尾部是相连的,当队列满时,新的元素会替换掉头部的元素;当队列空时,试图从队头取元素将导致“队空”异常。下面是C语言实现基本操作的简单示例:
```c
typedef struct {
int* array; // 存储数据的数组
int rear; // 当前rear指向的位置
int front; // 队首位置,初始为-1表示队列为空
int size; // 队列大小
} CircularQueue;
// 初始化环形队列
void initCircularQueue(CircularQueue* cq, int capacity) {
cq->array = (int*)malloc(capacity * sizeof(int));
cq->rear = -1;
cq->front = -1;
cq->size = capacity;
}
// 入队(enqueue)
void enqueue(CircularQueue* cq, int data) {
if (cq->rear == cq->size - 1) { // 队尾已满
printf("Queue is full.\n");
return;
}
cq->rear = (cq->rear + 1) % cq->size; // 使用模运算保持索引在0到size-1范围内
cq->array[cq->rear] = data;
}
// 出队(dequeue)
int dequeue(CircularQueue* cq) {
if (cq->front == -1) { // 队列为空
printf("Queue is empty.\n");
return -1; // 返回特殊值表示队空
}
int data = cq->array[cq->front]; // 获取并移除队首元素
cq->front = (cq->front + 1) % cq->size; // 更新队首
return data;
}
// 查看队首元素(front),这里返回队首元素而不实际出队
int getFront(CircularQueue* cq) {
if (cq->front == -1) {
printf("Queue is empty.\n");
return -1;
}
return cq->array[cq->front];
}
// 示例:
CircularQueue cq;
initCircularQueue(&cq, 5);
enqueue(&cq, 1); // 向队列添加元素
enqueue(&cq, 2);
enqueue(&cq, 3);
printf("Front element: %d\n", getFront(&cq)); // 输出1
enqueue(&cq, 4); // 尝试满队插入
printf("%d dequeued, queue now: ", dequeue(&cq)); // 输出2
printf("%d", getFront(&cq)); // 输出3
```
请注意,在实际项目中,为了更健壮地处理边界条件和内存管理,你需要添加适当的错误检查和释放内存的代码。同时,这只是一个基础实现,根据需要可能需要进一步优化或添加其他功能。
阅读全文
相关推荐


















