用C语言定义一个循环队列,并实现对循环队列的以下操作: (1)初始化 (2)入队 (3)出队 (4)求循环队列的长度 (5)取循环队列的队头元素 (6)显示队列中各元素的值 (7)用循环队列实现舞伴问题
时间: 2024-11-15 16:14:07 浏览: 34
详解数据结构C语言实现之循环队列
在C语言中,我们可以使用数组和索引来创建一个简单的循环队列。这里是一个基本的实现:
```c
#include <stdio.h>
#define MAX_SIZE 100
typedef struct {
int *queue; // 队列元素数组
int front; // 队头指针
int rear; // 队尾指针
int size; // 当前元素数量
} Queue;
// 初始化循环队列
void init(Queue *q) {
q->queue = (int*)malloc(MAX_SIZE * sizeof(int));
if (!q->queue)
printf("Memory allocation failed.\n");
q->front = q->rear = -1;
q->size = 0;
}
// 入队操作
void enqueue(Queue *q, int value) {
if (q->size == MAX_SIZE)
printf("Queue is full.\n");
else {
if (q->rear == -1)
q->rear = 0;
else
q->rear = (q->rear + 1) % MAX_SIZE;
q->queue[q->rear] = value;
q->size++;
}
}
// 出队操作
int dequeue(Queue *q) {
if (q->size <= 0)
return -1; // 空队列处理
int value = q->queue[q->front];
if (q->front == q->rear)
q->front = q->rear = -1;
else
q->front = (q->front + 1) % MAX_SIZE;
q->size--;
return value;
}
// 求循环队列的长度
int queue_length(Queue *q) {
return q->size;
}
// 取队头元素
int get_front(Queue *q) {
return (q->front != -1) ? q->queue[q->front] : -1;
}
// 显示队列元素
void display(Queue *q) {
if (q->size == 0)
printf("Queue is empty.\n");
else {
for (int i = 0; i < q->size; i++) {
if (i == q->front)
printf("(%d)", q->queue[i]);
else
printf("%d", q->queue[i]);
}
printf("\n");
}
}
// 舞伴问题:假设每个人都有一个舞伴,当找到一个新舞伴时,需要将旧舞伴从队列中移除并添加到新舞伴的列表。这是一个示例,简化版本,仅用于说明如何使用上述函数。
void partner(Queue *partners, Queue *new_partners) {
while (queue_length(partners) > 0) {
int current_partner = dequeue(partners);
enqueue(new_partners, current_partner);
}
}
// 示例用法
int main() {
Queue partners, new_partners;
init(&partners);
init(&new_partners);
// ... 执行入队、出队等操作 ...
display(&partners); // 显示当前伙伴列表
partner(&partners, &new_partners); // 将所有伙伴转移到新伙伴列表
return 0;
}
```
阅读全文