美文网首页
循环队列

循环队列

作者: Caiaolun | 来源:发表于2019-08-12 15:55 被阅读0次

二话不说上代码

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;
}

相关文章

网友评论

      本文标题:循环队列

      本文链接:https://www.haomeiwen.com/subject/ejpujctx.html