环形缓冲区
环形缓冲区是一种常见的缓存数据的数据结构,也称为环形队列,其特点是在存储空间的结尾处和开始处相连,可以循环利用空间。这种数据结构通常用于数据流的缓冲区,例如串口通信、音频数据等场景,可以将数据存储在环形缓冲区中,然后再按照一定规则进行处理。 环形缓冲区的实现方式有多种,其中比较常见的是使用两个指针来标识缓冲区的起始位置和结束位置。当数据被写入缓冲区时,将其存储在当前结束位置,并将结束位置指针向后移动一位;当数据被读出缓冲区时,将其从当前起始位置读取,并将起始位置指针向后移动一位。当结束指针指向缓冲区末尾时,需要将其设置为缓冲区的起始位置,以实现循环利用。
#define BUFFER_SIZE 10 //环形缓冲区大小
typedef struct {
char buffer[BUFFER_SIZE];
int head; //读指针
int tail; //写指针
} CircularBuffer;
void buffer_init(CircularBuffer* buffer) {
buffer->head = 0;
buffer->tail = 0;
} //读写指针初始化
int buffer_is_full(CircularBuffer* buffer) {
return (buffer->tail + 1) % BUFFER_SIZE == buffer->head;
} //判断缓存区是否已满
int buffer_is_empty(CircularBuffer* buffer) {
return buffer->head == buffer->tail;
} //
int buffer_push(CircularBuffer* buffer, char data) {
if (buffer_is_full(buffer)) {
return 0;
}
buffer->buffer[buffer->tail] = data;
buffer->tail = (buffer->tail + 1) % BUFFER_SIZE;
return 1;
}
int buffer_pop(CircularBuffer* buffer, char* data) {
if (buffer_is_empty(buffer)) {
return 0;
}
*data = buffer->buffer[buffer->head];
buffer->head = (buffer->head + 1) % BUFFER_SIZE;
return 1;
}
void main()
{
CircularBuffer my_buffer;
buffer_init(&my_buffer);
buffer_push(&my_buffer, 'a');
buffer_push(&my_buffer, 'b');
char data;
buffer_pop(&my_buffer, &data);
printf("%c\n", data); // 输出'a'
buffer_push(&my_buffer, 'c');
buffer_pop(&my_buffer, &data);
printf("%c\n", data); // 输出'b'
buffer_pop(&my_buffer, &data);
printf("%c\n", data); // 输出'c'
buffer_pop(&my_buffer, &data); // 这次调用会返回 0,说明缓冲区已经为空
}
#单片机