二话不说上代码
RingBuf.h
#pragma once
typedef unsigned char uint8_t;
typedef int Elem;
typedef struct circlequeue
{
int iLength;
int iSize;
int iHead;
int iTail;
Elem *Datas;
}Queue;
uint8_t Queue_Init(Queue* queue, int size);
uint8_t Queue_Delete(Queue *queue);
uint8_t isQueueEmpty(Queue *queue);
uint8_t isQueueFull(Queue *queue);
int Queue_size(Queue *queue);
uint8_t Queue_push(Queue *queue, Elem* data);
uint8_t Queue_pop(Queue *queue, Elem* data);
void Queue_printf(Queue *queue);
void cbPrint(Queue *queue);
RingBuf.cpp
#include <iostream>
#include "RingBuf.h"
uint8_t Queue_Init(Queue* queue, int size)
{
queue->iSize = size;
queue->iLength = 0;
queue->iTail = 0;
queue->iHead = 0;
queue->Datas = (Elem *)malloc(size * sizeof(Elem));
return 1;
}
uint8_t Queue_Delete(Queue *queue)
{
free(queue->Datas);
return 1;
}
static void QueueTailAdd(Queue *queue)
{
queue->iTail++;
queue->iTail = queue->iTail % queue->iSize;
}
static void QueueHeadAdd(Queue *queue)
{
queue->iHead++;
queue->iHead = queue->iHead % queue->iSize;
}
uint8_t isQueueEmpty(Queue *queue)
{
if (queue->iLength == 0)
{
return 1;
}
return 0;
}
uint8_t isQueueFull(Queue *queue)
{
if (queue->iLength / queue->iSize)
{
return 1;
}
return 0;
}
int Queue_size(Queue *queue)
{
return queue->iLength;
}
uint8_t Queue_push(Queue *queue, Elem* data)
{
queue->Datas[queue->iTail] = *data;
if (isQueueFull(queue))
{
QueueHeadAdd(queue);
}
QueueTailAdd(queue);
queue->iLength++;
if (queue->iLength > queue->iSize)
{
queue->iLength = queue->iSize;
}
return 1;
}
uint8_t Queue_pop(Queue *queue, Elem* data)
{
if (isQueueEmpty(queue))
{
return 0;//queue empty
}
*data = queue->Datas[queue->iHead];
QueueHeadAdd(queue);
queue->iLength--;
return 1;
}
void Queue_printf(Queue *queue)
{
int i;
int temp = queue->iHead;
printf("queue datas:\r\n");
for (i = 0; i<queue->iLength; i++)
{
printf("%d ", queue->Datas[temp++%queue->iSize]);
}
printf("\r\n");
}
void cbPrint(Queue *queue)
{
printf("size=0x%x, start=%d, end=%d\n", queue->iSize, queue->iHead, queue->iTail);
}
main.cpp
#include <iostream>
#include "RingBuf.h"
int main()
{
Queue ringbuf;
Queue_Init(&ringbuf, 20);
for (int i = 0; i < 203; i++)
{
Queue_push(&ringbuf, &i);
}
cbPrint(&ringbuf);
Queue_printf(&ringbuf);
for (int i = 0; i < 12; i++)
{
int temp;
Queue_pop(&ringbuf, &temp);
printf("Queue_pop_%d >>> %d\n", i, temp);
}
for (int i = 0; i < 8; i++)
{
Queue_push(&ringbuf, &i);
}
cbPrint(&ringbuf);
Queue_printf(&ringbuf);
int cout = ringbuf.iLength;
for (int i = 0; i < cout; i++)
{
int temp;
Queue_pop(&ringbuf, &temp);
printf("Queue_pop_%d >>> %d\n", i, temp);
}
getchar();
return 0;
}

网友评论