数据结构(10)---队列之环形队列

Posted 李憨憨_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构(10)---队列之环形队列相关的知识,希望对你有一定的参考价值。

环形队列



什么是环形队列

在这里插入图片描述

环形队列也是队列的一种数据结构, 也是在队头出队, 队尾入队;
只是环形队列的大小是确定的, 不能进行一个长度的增加, 当你把一个环形队列创建好之后, 它能存放的元素个数是确定的;
一般我们实现这个环形队列是通过一个连续的结构来实现的;
虽然环形队列在逻辑上是环形的, 但在物理上是一个定长的数组;
那如何在逻辑上形成一个环形的变化, 主要是在头尾指针当走到连续空间的末尾的时候, 它会做一个重置的操作
在这里插入图片描述

循环队列的实现

第一种实现

typedef struct {
    //第一种实现:
    int* _data;
    //第一个元素的位置: 队头位置
    int _front;
    //最后一个元素的下一个位置
    int _rear;
    int _k;
} MyCircularQueue;


MyCircularQueue* myCircularQueueCreate(int k) {
    //多开一个元素的空间
    MyCircularQueue* mq = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    mq->_data = (int*)malloc(sizeof(int) * (k + 1));
    mq->_front = mq->_rear = 0;
    mq->_k = k;
    return mq;
}

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    if(obj->_front == obj->_rear)
        return true;
    else
        return false;
}

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    if((obj->_rear + 1) % (obj->_k + 1) == obj->_front)
        return true;
    else
        return false;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    //判断队列是否已满
    if(myCircularQueueIsFull(obj))
        return false;
    obj->_data[obj->_rear++] = value;
    //判断队尾是否越界
    if(obj->_rear > obj->_k)
        obj->_rear = 0;
    return true;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    //判断队列是否为空
    if(myCircularQueueIsEmpty(obj))
        return false;
    //出队
    obj->_front++;
    //判断队头是否越界
    if(obj->_front > obj->_k)
        obj->_front = 0;
    return true;
}

int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    else
        return obj->_data[obj->_front];
}

int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    //返回队尾rear的前一个位置的元素
    //判断rear是否为0;
    if(obj->_rear != 0)
        return obj->_data[obj->_rear - 1];
    else
        return obj->_data[obj->_k];
}

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

第二种实现

typedef struct {
    //第一种实现:
    int* _data;
    //第一个元素的位置: 队头位置
    int _front;
    //最后一个元素的下一个位置
    int _rear;
    int _k;
    int _size;
} MyCircularQueue;


MyCircularQueue* myCircularQueueCreate(int k) {
    //多开一个元素的空间
    MyCircularQueue* mq = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    mq->_data = (int*)malloc(sizeof(int) * k);
    mq->_front = mq->_rear = 0;
    mq->_k = k;
    mq->_size = 0;
    return mq;
}

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    if(obj->_size == 0)
        return true;
    else
        return false;
}

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    if(obj->_size == obj->_k)
        return true;
    else
        return false;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    //判断队列是否已满
    if(myCircularQueueIsFull(obj))
        return false;
    obj->_data[obj->_rear++] = value;
    //判断队尾是否越界
    if(obj->_rear >= obj->_k)
        obj->_rear = 0;
    ++obj->_size;
    return true;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    //判断队列是否为空
    if(myCircularQueueIsEmpty(obj))
        return false;
    //出队
    obj->_front++;
    //判断队头是否越界
    if(obj->_front >= obj->_k)
        obj->_front = 0;
    --obj->_size;
    return true;
}

int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    else
        return obj->_data[obj->_front];
}

int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    //返回队尾rear的前一个位置的元素
    //判断rear是否为0;
    if(obj->_rear != 0)
        return obj->_data[obj->_rear - 1];
    else
        return obj->_data[obj->_k - 1];
}

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

以上是关于数据结构(10)---队列之环形队列的主要内容,如果未能解决你的问题,请参考以下文章

使用数组模拟普通队列,环形队列,(Java数据结构之队列)

数据结构之数组模拟队列(单项队列和环形队列)

数据结构之数组模拟队列(单项队列和环形队列)

linux内核之Kfifo环形队列

C语言之环形队列

java数据结构与算法:单向队列与环形队列详解(图片+代码)