如何用C语言实现Ringbufer环形队列数据结构

说明

以下代码实现了环形队列的数据结构,并且当数据长度超过缓存区大小时候,会覆盖掉旧的数据。可通过代码里面的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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值