当前位置: 首页 > news >正文

数据结构(11)栈和队列算法题 OVA

一、概念与结构

循环队列是一种特殊的队列,首尾相连成环,也叫环形队列。环形队列具有以下三个特点:

(1)队头删除数据,队尾插入数据。

(2)给定固定的空间,使用过程中不能扩容。

(3)环形队列满了之后,不能继续插入数据(即插入数据失败)。

环形队列可以使用数组实现,也可以使用循环链表实现。使用数组实现的话更简单。定义头指针front和尾指针rear。当rear指向最后一个元素的时候,我们只需要让rear % 空间大小就可以让rear指针重新指向front。

但是,这样又带来一个问题,当环形队列为空时:front == rear;当环形队列满了:front == rear。那么,我们该如何区分环形队列是空还是满呢?我们可以在结构体中再定义一个size变量,用于统计环形队列中有效数据的个数。但是这样又要额外开辟四个字节的空间,有没有更好的办法呢?我们额外申请一块空间,但这块空间不保存任何数据,这样就不用额外增加结构体的成员变量。

此时,rear == front表示环形队列为空;如果满足(rear + 1)%(k + 1)== front,表示环形队列满了。

二、题目描述 

https://leetcode.cn/problems/design-circular-queue

三、参考代码  

typedef struct 
{int* arr;int front;//队头int rear;//队尾int capacity;//循环队列的空间大小
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) 
{MyCircularQueue* pq = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));//申请k+1个空间pq->arr = (int*)malloc((k + 1) * sizeof(int));pq->front = pq->rear = 0;pq->capacity = k;return pq;
}bool myCircularQueueIsEmpty(MyCircularQueue* obj) 
{return obj->front == obj->rear;
}bool myCircularQueueIsFull(MyCircularQueue* obj) 
{return (obj->rear + 1) % (obj->capacity + 1) == obj->front;
}
//向循环队列中插入一个元素
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) 
{//先判断是否满了if(myCircularQueueIsFull(obj)){return false;}//没有满else{obj->arr[obj->rear++] = value;obj->rear %= obj->capacity + 1;return true;}
}
//从循环队列中删除一个元素
bool myCircularQueueDeQueue(MyCircularQueue* obj) 
{if(myCircularQueueIsEmpty(obj)){return false;}//非空else{obj->front++;obj->front %= obj->capacity + 1;return true;}
}int myCircularQueueFront(MyCircularQueue* obj) 
{if(myCircularQueueIsEmpty(obj)){return -1;}return obj->arr[obj->front];
}int myCircularQueueRear(MyCircularQueue* obj) 
{if(myCircularQueueIsEmpty(obj)){return -1;}int prev = obj->rear - 1;if(obj->rear == 0){prev = obj->capacity;}return obj->arr[prev];
}void myCircularQueueFree(MyCircularQueue* obj) 
{if(obj->arr)free(obj->arr);obj->arr = NULL;obj->front = obj->rear = obj->capacity = 0;free(obj);obj = NULL;
}/*** 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);
*/

http://www.dtcms.com/a/309627.html

相关文章:

  • 基于OpenCV的cv2.solvePnP方法实现头部姿态估计
  • AJAX快速入门 - 四个核心步骤
  • DB-GPT 0.7.3 版本更新:支持Qwen3 Embedding和Reranker模型、支持知识库自定义检索策略等
  • 从Web2.0到Web3.0:社交参与方式的重塑与延伸
  • 优化算法专栏——阅读导引
  • springboot助农平台
  • 【PHP 类常量详解:从入门到精通】
  • RK3588实现wlan直连
  • Qt 开发 IDE 插件开发指南
  • 如何在UEFI SHELL下查看UEFI Driver
  • 洛谷P4479第K大斜率
  • OSPF笔记整理
  • Transformer架构全解析:搭建AI的“神经网络大厦“
  • 开箱即用的Next.js SSR企业级开发模板
  • 【性能测试】混合业务场景TPS+内存溢出定位分析+调优和分析(详情)
  • 猫眼浏览器:简约安全的 Chrome 内核增强版浏览器
  • 【JVM篇13】:兼顾吞吐量和低停顿的G1垃圾回收器
  • UniappDay06
  • wsl /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.28‘ not found
  • 【Spring 】Spring Cloud Gateway 直连 Istio 服务网格深度集成方案
  • 使用uniapp开发小程序-【引入字体并全局使用】
  • 软件测试测评公司关于HTTP安全头配置与测试?
  • 07 连锁不平衡和群体结构分析原理
  • 理想I8对撞乘龙卡车,AI基于数学和物理的角度如何看?
  • 应急响应(windows工具版)
  • echarts一个图例控制多个图表
  • Git 进阶使用
  • ansible 在EE 容器镜像中运行
  • C primer plus (第六版)第十章 编程练习第7,8,9,10,11题
  • Linux基本服务——web服务解析