用C语言写一个环式数据缓冲区
时间: 2023-03-22 16:02:20 浏览: 95
C 语言中实现环形缓冲区
好的,以下是用C语言编写环形数据缓冲区的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define BUFFER_SIZE 10
typedef struct ring_buffer {
int *data; // 缓冲区数据指针
int head; // 缓冲区头部位置
int tail; // 缓冲区尾部位置
} ring_buffer;
void ring_buffer_init(ring_buffer *buf) {
buf->data = malloc(sizeof(int) * BUFFER_SIZE);
buf->head = 0;
buf->tail = 0;
}
int ring_buffer_is_empty(ring_buffer *buf) {
return buf->head == buf->tail;
}
int ring_buffer_is_full(ring_buffer *buf) {
return ((buf->tail + 1) % BUFFER_SIZE) == buf->head;
}
void ring_buffer_push(ring_buffer *buf, int value) {
if (ring_buffer_is_full(buf)) {
printf("Buffer overflow!\n");
return;
}
buf->data[buf->tail] = value;
buf->tail = (buf->tail + 1) % BUFFER_SIZE;
}
int ring_buffer_pop(ring_buffer *buf) {
if (ring_buffer_is_empty(buf)) {
printf("Buffer underflow!\n");
return -1;
}
int value = buf->data[buf->head];
buf->head = (buf->head + 1) % BUFFER_SIZE;
return value;
}
int main() {
ring_buffer buf;
ring_buffer_init(&buf);
ring_buffer_push(&buf, 1);
ring_buffer_push(&buf, 2);
ring_buffer_push(&buf, 3);
printf("%d\n", ring_buffer_pop(&buf));
printf("%d\n", ring_buffer_pop(&buf));
ring_buffer_push(&buf, 4);
ring_buffer_push(&buf, 5);
printf("%d\n", ring_buffer_pop(&buf));
printf("%d\n", ring_buffer_pop(&buf));
printf("%d\n", ring_buffer_pop(&buf));
return 0;
}
```
这段代码使用了一个结构体 `ring_buffer` 来表示环形缓冲区,其中 `data` 指向缓冲区数据的指针,`head` 和 `tail` 分别表示缓冲区头部和尾部的位置。我们使用 `%` 运算符来保证 `head` 和 `tail` 在缓冲区大小范围内循环。 `ring_buffer_init` 函数用来初始化环形缓冲区,`ring_buffer_is_empty` 和 `ring_buffer_is_full` 函数分别用来判断缓冲区是否为空或已满。`ring_buffer_push` 和 `ring_buffer_pop` 分别用来向缓冲区中添加元素和从缓冲区中取出元素。
阅读全文