说明
以下代码实现了环形队列的数据结构,并且当数据长度超过缓存区大小时候,会覆盖掉旧的数据。可通过代码里面的main函数测试结果。
// ringbufer.h
#ifndef RINGBUF_H
#define RINGBUF_H
#define RINGBUF_CAPACITY 5
typedef struct {
int *buffer;
int head;
int tail;
int size;
int capacity;
} RingBuffer;
// 初始化环形队列
RingBuffer* createRingBuffer(int capacity);
// 入队操作
void ringbuf_enqueue(RingBuffer *rb, int value);
// 出队操作
int ringbuf_dequeue(RingBuffer *rb);
// 获取队列中的元素数量
int ringbuf_getSize(RingBuffer *rb);
// 判断队列是否为空
int ringbuf_isEmpty(RingBuffer *rb);
// 判断队列是否已满
int ringbuf_isFull(RingBuffer *rb);
#endif // RINGBUF_H
// ringbufer.c
#include <stdio.h>
#include <stdlib.h>
#include "ringbuf.h"
typedef struct {
int *buffer; // 存储数据的缓冲区
int head; // 队列头部索引
int tail; // 队列尾部索引
int size; // 当前队列中的元素数量
int capacity; // 队列的容量
} RingBuffer;
// 初始化环形队列
RingBuffer* createRingBuffer(int capacity) {
RingBuffer *rb = (RingBuffer*)malloc(sizeof(RingBuffer));
rb->buffer = (int*)malloc(RINGBUF_CAPACITY * sizeof(int));
rb->head = 0;
rb->tail = 0;
rb->size = 0;
rb->capacity = RINGBUF_CAPACITY;
return rb;
}
// 入队操作
void ringbuf_enqueue(RingBuffer *rb, int value) {
if (rb->size == rb->capacity) {
// 队列已满,覆盖旧数据
rb->head = (rb->head + 1) % rb->capacity;
} else {
rb->size++;
}
rb->buffer[rb->tail] = value;
rb->tail = (rb->tail + 1) % rb->capacity;
}
// 出队操作
int ringbuf_dequeue(RingBuffer *rb) {
if (rb->size == 0) {
printf("Queue is empty\n");
return -1;
}
int value = rb->buffer[rb->head];
rb->head = (rb->head + 1) % rb->capacity;
rb->size--;
return value;
}
// 获取队列中的元素数量
int ringbuf_getSize(RingBuffer *rb) {
return rb->size;
}
// 判断队列是否为空
int ringbuf_isEmpty(RingBuffer *rb) {
return rb->size == 0;
}
// 判断队列是否已满
int ringbuf_isFull(RingBuffer *rb) {
return rb->size == rb->capacity;
}
// 主函数,展示环形队列的使用方法
int main() {
RingBuffer *rb = createRingBuffer(RINGBUF_CAPACITY);
ringbuf_enqueue(rb, 1);
ringbuf_enqueue(rb, 2);
ringbuf_enqueue(rb, 3);
ringbuf_enqueue(rb, 4);
ringbuf_enqueue(rb, 5);
printf("Queue size: %d\n", ringbuf_getSize(rb)); // 输出队列大小
ringbuf_enqueue(rb, 6); // 队列已满,覆盖旧数据
printf("Queue size after enqueue 6: %d\n", ringbuf_getSize(rb));
while (!ringbuf_isEmpty(rb)) {
printf("%d\n", ringbuf_dequeue(rb)); // 依次出队并打印元素
}
// 释放内存
free(rb->buffer);
free(rb);
return 0;
}