什么是环形队列,采用什么方法实现环形队列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是环形队列,采用什么方法实现环形队列相关的知识,希望对你有一定的参考价值。

在用数组表示队列时把数组看成是一个环形的,即令数组中的第一个元素紧跟在最末一个单元之后就形成了一个环形队列。

通常采用逻辑上求余数的方法来实现环形队列,假设数组的大小为n,当元素下标i增1时采用i=(i+1)%n来实现。

扩展资料:

队列的特点是先进先出,或者后进后出。环状队列在数据结构里称为循环队列。也就是把队列的尾和头接在一起形成一个环,这样当发生假溢出时,尾指针可以跳到数组的开始,重复利用那些已经从队列里删掉的存储单元。

可以用数组和两个指针(头指针和尾指针,但数据类型可以为整形,只是表示指向的含义)组成一个结构体来实现队列。

环形队列是一个可以实现所有结构体且可以提高个人对指针的了解的一个程序。

程序是用codeblock写的,中间碰到了一个又一个的问题,都最终解决了。这个结构可以作为所有结构体的实现的一个模式。写写这些程序可以不断让自己更加深入认识指针,更加熟悉指针的各种使用。

参考资料来源:百度百科-环形队列

参考技术A 在用数组表示队列时把数组看成是一个环形的,即令数组中的第一个元素紧跟在最末一个单元之后就形成了一个环形队列。

通常采用逻辑上求余数的方法来实现环形队列,假设数组的大小为n,当元素下标i增1时采用i=(i+1)%n来实现。
参考技术B 环形队列的特点是,不需要进行动态的内存释放和分配,使用固定大小的内存空间反复使用。
非常的简单和高效本回答被提问者采纳

数据结构(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);
}

以上是关于什么是环形队列,采用什么方法实现环形队列的主要内容,如果未能解决你的问题,请参考以下文章

channel原来就是个环形队列

环形队列-高效定时触发

数据结构--队列的实现(采用环形数组方式)

数据结构--队列的实现(采用环形数组方式)

Java数据结构 -- 环形队列 & 数组模拟环形队列

C语言实现环形队列的原理和方法