环形缓冲队列是一种常见的数据结构,可以用于在多个线程之间进行数据传输。下面是一个用C语言实现的环形缓冲队列的代码:
在以下的代码中,定义了一个结构体Queue来表示环形缓冲队列,其中包含了一个指向存储数据的缓冲区buffer,以及头指针head和尾指针tail,以及队列的大小size。
首先定义了createQueue函数来创建一个新的队列对象,并分配缓冲区的内存。然后,定义了isFull和isEmpty函数来检查队列是否满或空。enqueue函数用于向队列中添加数据,如果队列已满,则不添加数据并打印错误消息。dequeue函数用于从队列中删除数据,如果队列为空,则不删除数据并打印错误消息。printQueue函数用于打印队列中的数据。
在main函数中,首先创建一个队列对象,然后向队列中添加10个数据。由于队列的大小为10,所以添加第11个数据时,队列已满,不会添加数据并打印错误消息。接着,从队列中删除了前三个数据,并用printQueue函数打印了当前队列中的数据。最后,向队列中添加了3个数据,并用printQueue函数打印了最终的队列中的数据。
以下就是一个用C语言实现的环形缓冲队列的代码。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define QUEUE_SIZE 10
typedef struct
{
int* buffer;
int head;
int tail;
int size;
} Queue;
/* 创建队列 */
Queue* createQueue(int size)
{
Queue* queue = (Queue*) malloc(sizeof(Queue));
queue->buffer = (int*) malloc(size * sizeof(int));
queue->head = 0;
queue->tail = 0;
queue->size = size;
return queue;
}
/* 队列满 */
bool isFull(Queue* queue)
{
return (queue->tail + 1) % queue->size == queue->head;
}
/* 队列空 */
bool isEmpty(Queue* queue)
{
return queue->head == queue->tail;
}
/* 入队列 */
void enqueue(Queue* queue, int data)
{
if (isFull(queue)) {
printf("Queue is full!\n");
return;
}
queue->buffer[queue->tail] = data;
queue->tail = (queue->tail + 1) % queue->size;
}
/* 出队列 */
int dequeue(Queue* queue)
{
if (isEmpty(queue)) {
printf("Queue is empty!\n");
return -1;
}
int data = queue->buffer[queue->head];
queue->head = (queue->head + 1) % queue->size;
return data;
}
/* 打印队列 */
void printQueue(Queue* queue)
{
printf("Queue: ");
int i = queue->head;
while (i != queue->tail) {
printf("%d ", queue->buffer[i]);
i = (i + 1) % queue->size;
}
printf("\n");
}
int main()
{
Queue* queue = createQueue(QUEUE_SIZE);
enqueue(queue, 1);
enqueue(queue, 2);
enqueue(queue, 3);
enqueue(queue, 4);
enqueue(queue, 5);
enqueue(queue, 6);
enqueue(queue, 7);
enqueue(queue, 8);
enqueue(queue, 9);
enqueue(queue, 10);
enqueue(queue, 11);
printQueue(queue);
dequeue(queue);
dequeue(queue);
dequeue(queue);
printQueue(queue);
enqueue(queue, 11);
enqueue(queue, 12);
enqueue(queue, 13);
printQueue(queue);
return 0;
}