embedded2share

一、环形队列的优势

环形队列是一种特殊的队列,它可以解决普通队列在使用时空间利用不充分的问题。在环形队列中,当队列满时,队列的尾指针指向队列的起始位置,而不是指向队列的最后一个元素。这样可以在不浪费空间的情况下存储更多的元素。
下面我们来详细讲解一下环形队列的实现。

二、环形队列的定义

首先,我们需要定义一个环形队列的结构体,包含以下成员变量:

  • int *queue:指向环形队列的指针;
  • int front:指向队列的头部;
  • int rear:指向队列的尾部;
  • int size:队列的容量。
typedef struct {
    int *queue;
    int front;
    int rear;
    int size;
} MyCircularQueue;

三、环形队列的初始化

在初始化环形队列时,我们需要为其动态分配内存空间,并将头指针和尾指针都初始化为-1,表示队列为空。

MyCircularQueue* myCircularQueueCreate(int k) 
{
    MyCircularQueue *obj =(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
obj
->queue = (int *)malloc(sizeof(int) * k); obj->front = -1; obj->rear = -1; obj->size = k; return obj; }

四、环形队列的入队

当向队列中插入元素时,我们需要先判断队列是否已满。如果队列已满,则插入失败,返回false;否则,将元素插入到队列的尾部,并将尾指针指向下一个位置。

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) 
{
    if (myCircularQueueIsFull(obj)) 
    {
        return false;
    }

    obj->rear = (obj->rear + 1) % obj->size;
    obj->queue[obj->rear] = value;
    if (obj->front == -1) 
  { obj
->front = obj->rear; } return true; }

五、环形队列的出队

当从队列中删除元素时,我们需要先判断队列是否为空。如果队列为空,则删除失败,返回false;否则,将元素从队列的头部删除,并将头指针指向下一个位置。

bool myCircularQueueDeQueue(MyCircularQueue* obj) 
{
    if (myCircularQueueIsEmpty(obj))
    {
        return false;
    }

    if (obj->front == obj->rear) 
    {
        obj->front = -1;
        obj->rear = -1;
        return true;
    }

    obj->front = (obj->front + 1) % obj->size;

    return true;
}

 六、环形队列的查看队首元素

当查看队列的头部元素时,我们需要先判断队列是否为空。如果队列为空,则返回-1;否则返回队列头部的元素。

int myCircularQueueFront(MyCircularQueue* obj) 
{
    if (myCircularQueueIsEmpty(obj)) 
    {
        return -1;
    }

    return obj->queue[obj->front];
}

 七、环形队列的查看队尾元素

当查看队列的尾部元素时,我们需要先判断队列是否为空。如果队列为空,则返回-1;否则,返回队列尾部的元素。

int myCircularQueueRear(MyCircularQueue* obj) 
{
    if (myCircularQueueIsEmpty(obj)) 
    {
        return -1;
    }

    return obj->queue[obj->rear];
}    

八、环形队列的判断是否为空

当判断队列是否为空时,只需要判断头指针是否为-1即可。

bool myCircularQueueIsEmpty(MyCircularQueue* obj)
{
    return obj->front == -1;
}

 九、环形队列的判断是否已满

当判断队列是否已满时,只需要判断尾指针下一个位置是否为头指针即可。

bool myCircularQueueIsFull(MyCircularQueue* obj) 
{
    return (obj->rear + 1) % obj->size == obj->front;
}

十、环形队列的销毁

当环形队列不再使用时,需要释放其占用的内存空间。

void myCircularQueueFree(MyCircularQueue* obj) 
{
    free(obj->queue);
    free(obj);
}

总的来说,环形队列是一种非常实用的数据结构,特别适用于空间有限的情况下。通过合理的设计和实现,可以使得队列的空间利用率更高,并且操作效率也比较高。


 

关于更多嵌入式C语言、FreeRTOS、RT-Thread、Linux应用编程、linux驱动等相关知识,关注公众号【嵌入式Linux知识共享】,后续精彩内容及时收看了解。

相关文章: