帮我写一个环形队列,队列元素的结构体包括一个长度:int length和一个长度为length的unsigned char *buf
时间: 2024-10-24 13:06:42 浏览: 26
模拟单片机中的 NTC 温度传感器数据采集,并实现一个 FIFO(先进先出)队列来存储这些数据.txt
环形队列是一种特殊的线性队列,它通过循环链接使得最后一个元素的下一个位置指向第一个元素,从而实现了队列的“先进先出”特性,即使队列满也不会丢失数据。下面是一个简单的C语言实现环形队列的结构体定义以及基本操作:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int capacity; // 队列最大容量
unsigned char *buf; // 存储元素的数组
int front; // 队头索引
int rear; // 队尾索引
} CircularQueue;
// 初始化环形队列
CircularQueue* createQueue(int capacity) {
CircularQueue *queue = (CircularQueue*) malloc(sizeof(CircularQueue));
if (!queue) {
printf("Memory allocation failed.\n");
return NULL;
}
queue->capacity = capacity;
queue->buf = (unsigned char*)malloc(capacity * sizeof(unsigned char));
queue->front = -1;
queue->rear = -1;
return queue;
}
// 插入元素到队尾
void enqueue(CircularQueue *queue, unsigned char element) {
if ((queue->rear + 1) % queue->capacity == queue->front) { // 如果队满
printf("Queue is full.\n");
return;
}
queue->buf[(queue->rear + 1) % queue->capacity] = element;
queue->rear = (queue->rear + 1) % queue->capacity;
if (queue->front == -1) queue->front = queue->rear;
}
// 删除并返回队头元素
unsigned char dequeue(CircularQueue *queue) {
if (queue->front == -1) {
printf("Queue is empty.\n");
return '\0';
}
unsigned char element = queue->buf[queue->front];
if (queue->front == queue->rear) { // 如果队空
free(queue->buf);
free(queue);
queue = NULL;
} else {
queue->buf[queue->front] = '\0'; // 清空队头元素位置
queue->front = (queue->front + 1) % queue->capacity;
}
return element;
}
// 检查队列是否为空
int isEmpty(CircularQueue *queue) {
return queue->front == -1;
}
// 检查队列是否已满
int isFull(CircularQueue *queue) {
return (queue->rear + 1) % queue->capacity == queue->front;
}
阅读全文