请写出一个循环队列结构体和相应的操作函数:
时间: 2024-12-13 20:16:45 浏览: 4
循环队列是一种特殊的线性表,它的两端可以相连形成一个环形结构。在循环队列中,添加元素时会从尾部开始,如果满了就移动头部指针;删除元素时也是从头部开始,如果为空则将尾部指针移到头的位置。以下是基本的循环队列结构体以及几个常见的操作函数的示例:
```c++
#include <stdbool.h>
#define MAX_SIZE 100
typedef struct {
int* data; // 存储数据的数组
int front; // 队首位置
int rear; // 队尾位置
} Queue;
// 初始化循环队列
Queue createQueue() {
Queue q;
q.data = (int*)malloc(MAX_SIZE * sizeof(int));
if (q.data == NULL) {
printf("Memory allocation failed.\n");
return q;
}
q.front = -1;
q.rear = -1;
return q;
}
// 判断队列是否为空
bool isEmpty(Queue q) {
return q.front == -1 && q.rear == -1;
}
// 判断队列是否已满
bool isFull(Queue q) {
return (q.rear + 1) % MAX_SIZE == q.front;
}
// 入队操作
void enqueue(Queue* q, int item) {
if (isFull(*q)) {
printf("Queue is full.\n");
return;
}
if (isEmpty(*q)) {
q->front = q->rear = 0;
} else {
q->rear = (q->rear + 1) % MAX_SIZE;
}
q->data[q->rear] = item;
}
// 出队操作
int dequeue(Queue* q) {
if (isEmpty(*q)) {
printf("Queue is empty.\n");
return -1; // 返回特殊值表示队列空
}
int item = q->data[q->front];
if (q->front == q->rear) {
free(q->data);
q->front = q->rear = -1;
} else {
q->front = (q->front + 1) % MAX_SIZE;
}
return item;
}
// 显示队列内容
void display(Queue q) {
if (isEmpty(q)) {
printf("Queue is empty.\n");
} else {
for (int i = q.front; i != q.rear; i = (i + 1) % MAX_SIZE) {
printf("%d ", q.data[i]);
}
printf("%d\n", q.data[q.rear]); // 如果队列不是满的,打印最后一个元素
}
}
```
阅读全文