【那些年那些题】环形队列

简介: 【那些年那些题】环形队列

环形队列介绍:


在实际中,我们会用到一种特殊的队列,即环形队列,也可以叫做循环队列。在操作系统中有一个生产者消费者模型使用的就是循环队列。循环队列可以用数组实现,也可以用链表实现。

 循环队列仍是一种线性结构,它是基于队列先进先出的特性在队尾连接队头实现的,在逻辑结构上就构成了一个环状,所以被叫做环形队列、循环队列。

 循环队列的一个有点是,我们可以不断循环的利用这个队列的空间,一个普通的队列,在元素满载之后就不能再进行元素插入了,但是环形队列可以。不过会将之前的值覆盖,所以并不是所有条件下都适用。

 操作系统中的生产者消费者模型,就是典型的循环队列。用餐厅举例就是,这个餐厅只有10张桌子(10个空间),我这10张桌子没有满,顾客就可以直接上桌点菜(直接进行元素插入)。但是如果桌子使用完了,那就只有等之前的顾客吃完饭之后,后来的顾客才能上桌点菜(对首的元素已经使用完,且之后不在使用,这块空间就能够再次使用了)。


e08cfc3824fe4637861d551ecd8c7e66.png

题目链接:

  设计循环队列

代码实现:

typedef struct {
    int* a;
    int head;
    int tail;
    int k;
} MyCircularQueue;
MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    //多开辟一个空间,用于判满
    obj->a = (int*)malloc(sizeof(int) * (k + 1));
    obj->head = obj->tail = 0;
    obj->k = k;
    return obj;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj)
{
    return obj->tail == obj->head;
}
bool myCircularQueueIsFull(MyCircularQueue* obj)
{
    return ((obj->tail+1) % (obj->k+1)) == obj->head;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if(myCircularQueueIsFull(obj))
        return false;
    obj->a[obj->tail++] = value;
    obj->tail %= (obj->k+1);
    return true;
}
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return false;
    obj->head++;
    obj->head %= (obj->k+1);
    return true;
}
int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    else
        return obj->a[obj->head];
}
int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    else
        return obj->a[(obj->tail + obj->k) % (obj->k + 1)];
}
void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->a);
    free(obj);
}
/**
 * Your MyCircularQueue struct will be instantiated and called as such:
 * MyCircularQueue* obj = myCircularQueueCreate(k);
 * bool param_1 = myCircularQueueEnQueue(obj, value);
 * bool param_2 = myCircularQueueDeQueue(obj);
 * int param_3 = myCircularQueueFront(obj);
 * int param_4 = myCircularQueueRear(obj);
 * bool param_5 = myCircularQueueIsEmpty(obj);
 * bool param_6 = myCircularQueueIsFull(obj);
 * myCircularQueueFree(obj);
*/
目录
相关文章
|
6月前
|
存储 缓存 算法
队列的学习(二) 循环队列
队列的学习(二) 循环队列 循环队列是一种基于数组实现的队列,相比于普通队列,它的插入和删除操作更加高效。循环队列可以避免在队列头部删除元素时进行大量的数据搬移操作,实现了队列的“循环利用”。
|
C++
7.5 C/C++ 实现链表队列
链表队列是一种基于链表实现的队列,相比于顺序队列而言,链表队列不需要预先申请固定大小的内存空间,可以根据需要动态申请和释放内存。在链表队列中,每个节点包含一个数据元素和一个指向下一个节点的指针,头节点表示队头,尾节点表示队尾,入队操作在队尾插入元素,出队操作在队头删除元素,队列的长度由节点数量决定。由于链表队列没有容量限制,因此可以处理任意数量的元素,但是相比于顺序队列,链表队列的访问速度较慢,因为需要通过指针来访问下一个节点。
74 0
|
人工智能
FIFO队列和优先队列
FIFO队列和优先队列
100 0
|
存储 缓存 算法
【数据结构】队列(循环队列和链队列)详细讲解各种操作
【数据结构】队列(循环队列和链队列)详细讲解各种操作
896 0
|
存储 索引
【数据结构】—— 队列(有序队列及环形队列的数组实现)
【数据结构】—— 队列(有序队列及环形队列的数组实现)
201 0
【数据结构】—— 队列(有序队列及环形队列的数组实现)
Java实现队列——顺序队列、链式队列
#### 概念 先进者先出,这就是典型的“队列”。(First In, First Out,FIFO)。 我们知道,栈只支持两个基本操作:入栈push()和出栈pop()。队列跟栈非常相似,支持的操作也很有限,最基本的操作也是两个:入队和出队。入队 `enqueue()`,让一个数据到队列尾部;出队 `dequeue()`,从队列头部取一个元素。
|
存储 算法 Java
Java数据结构:使用数组模拟队列(队列与环形队列)
文章目录 1 队列 1.1 何为队列及实现思路 1.2 数组模拟队列ArrayQueue的实现 1.3 测试队列ArrayQueueDemo测试类的实现 2 环形队列 2.1 环形队列简介及实现思路 2.2 数组模拟环形队列CircleArrayQueue的实现 2.3 测试队列CircleArrayQueueDemo测试类的实现 写在最后
Java数据结构:使用数组模拟队列(队列与环形队列)
|
存储 C++
队列的基本概念详解,循环队列、链式队列的C++详细实现
一、队列是什么? 二、循环队列 1.知识点概述 2.动态分配 3.初始化 4.入队 5.出队 6. 取对头元素 7.取队列长度 8.总的代码 三 、链式链表 1.链队列的结构 2.链队列入队
407 0
队列的基本概念详解,循环队列、链式队列的C++详细实现
Day9——用栈实现队列、用队实现拟栈
Day9——用栈实现队列、用队实现拟栈
116 0