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

网站设计确认手机网站制

网站设计确认,手机网站制,网站开发与客户交流,格力网站的建设情况目录 1.题目 2.分析 方法1:链表 尝试使用单向循环链表模拟 插入节点 解决方法1:开辟(k1)个节点 解决方法2:使用变量size记录队列元素个数 获取队尾元素 其他函数的实现说明 方法2:数组 重要点:指针越界的解决方法 方法1:单独判断 方法2:取模 3.数组代码的逐步实现…目录 1.题目 2.分析 方法1:链表 尝试使用单向循环链表模拟 插入节点 解决方法1:开辟(k1)个节点 解决方法2:使用变量size记录队列元素个数 获取队尾元素 其他函数的实现说明 方法2:数组 重要点:指针越界的解决方法 方法1:单独判断 方法2:取模 3.数组代码的逐步实现 方法1:越界时单独判断 提交结果 方法2:每次都取模 提交结果 1.题目 https://leetcode.cn/problems/design-circular-queue/ 设计你的循环队列实现。 循环队列是一种线性数据结构其操作表现基于 FIFO先进先出原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里一旦一个队列满了我们就不能插入下一个元素即使在队列前面仍有空间。但是使用循环队列我们能使用这些空间去存储新的值。 你的实现应该支持如下操作 MyCircularQueue(k): 构造器设置队列长度为 k 。Front: 从队首获取元素。如果队列为空返回 -1 。Rear: 获取队尾元素。如果队列为空返回 -1 。enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。isEmpty(): 检查循环队列是否为空。isFull(): 检查循环队列是否已满。 示例 MyCircularQueue circularQueue new MyCircularQueue(3); // 设置长度为 3 circularQueue.enQueue(1);  // 返回 true circularQueue.enQueue(2);  // 返回 true circularQueue.enQueue(3);  // 返回 true circularQueue.enQueue(4);  // 返回 false队列已满 circularQueue.Rear();  // 返回 3 circularQueue.isFull();  // 返回 true circularQueue.deQueue();  // 返回 true circularQueue.enQueue(4);  // 返回 true circularQueue.Rear();  // 返回 4 提示 所有的值都在 0 至 1000 的范围内操作数将在 1 至 1000 的范围内请不要使用内置的队列库。 2.分析 方法1:链表 看到本题,很容易想到用链表解 尝试使用单向循环链表模拟 例如k3,很容易想到开辟三个空节点 要访问循环队列的头和尾,需要两个指针front(头指针)和rear(尾指针),初始状态下,链表为空时,front和rear都指向同一个节点 现检测链表的功能是否能正常执行 插入节点 每插入一个元素,按队列先进先出原则,应该rear,如下图: 当队列满时,如下图: 发现问题:队列为空或满时,front和rear都指向同一个节点,无法区分 解决方法1:开辟(k1)个节点 增加一个节点后,当队列满时,rear-nextfront;当队列为空时,rearfront 解决方法2:使用变量size记录队列元素个数 当队列为空时,size0;当队列满时,sizek.以此来区分两种情况 获取队尾元素 无论开辟(k1)个节点还是使用变量size记录队列元素个数,rear都指向尾节点的下一个节点,需要找尾(时间复杂度为,较消耗时间),或者另外使用一个rear_prev变量来记录rear指向节点的前一个节点,或者使用双向链表 其他函数的实现说明 从队首获取元素:返回front指向的节点的值即可 删除一个元素:front 方法2:数组 讲讲和链表的不同点: 重要点:指针越界的解决方法 1.无论开辟(k1)个节点还是使用变量size记录队列元素个数,front和rear都有越界的可能性 以开辟(k1)个节点举例: 例如下图,再插入一个元素,如果rear,则会越界 例如下图,再删除一个元素,如果front,则会越界 2.获取队尾元素时,可能出现rear越界访问的情况 当队列不为空时,直接访问return obj-arr[obj-rear-1];可能访问到obj-arr[-1]的位置,可以单独判断或者对rear取模 方法1:单独判断 如果rear1越界,则rear0;如果front1越界,则front0; 方法2:取模 队列未满时,插入元素:当reark时,再插入元素时rear,之后处理越界的rear,使其等于0,则,rear(rear1)%(k1) 队列不为空时,删除元素:当frontk时,再插入元素时front,之后处理越界的front,使其等于0,则,front(front1)%(k1) 队列不为空时,访问队尾元素:例如rear0,要访问到reark的位置,即arr[(rear-1k1)%(k1)arr[(reark)%(k1) 判断队列是否已满,如果满了,例如reark,要使rear的下一个为front0,即判断(rear1)%(k1)front 3.数组代码的逐步实现 读题可知:如果用数组来模拟循环队列,那么结构体成员变量应该有4个 1.指向数组的指针a,类型为int* 2.队首和队尾各需要一个变量来访问:front和rear,类型都为int,充当数组a的下标 3.队列的长度k,类型为int 显然应该用malloc在堆区上开辟空间,接收的指针为结构体指针,否则函数返回后,栈区空间会被销毁 之后初始化结构体的成员变量 方法1:越界时单独判断 typedef struct {int* arr;int front;int rear;int k; } MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj(MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj-arr(int*)malloc(sizeof(int)*(k1));obj-frontobj-rear0;obj-kk;return obj; }bool myCircularQueueIsFull(MyCircularQueue* obj);//先声明 bool myCircularQueueIsEmpty(MyCircularQueue* obj);//先声明 bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if (myCircularQueueIsFull(obj))return false;if (obj-rear!obj-k)obj-arr[obj-rear]value;elseobj-rear0;obj-arr[obj-k]value;return true; }bool myCircularQueueDeQueue(MyCircularQueue* obj) {if (myCircularQueueIsEmpty(obj))return false;if (obj-front!obj-k)obj-front;elseobj-front0;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;if (obj-rear)//rear!0return obj-arr[obj-rear-1];//rear0return obj-arr[obj-k]; }bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj-frontobj-rear; }bool myCircularQueueIsFull(MyCircularQueue* obj) {int rear_copyobj-rear;if (rear_copy1obj-front)return true;else if (rear_copyobj-k obj-front0)return true;elsereturn false; }void myCircularQueueFree(MyCircularQueue* obj) {free(obj-arr);free(obj); } 代码还可以精简些,例如 bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj-rear1obj-front) || (obj-rearobj-k obj-front0); }提交结果 方法2:每次都取模 ★注意:rear或者front后一定要取模! typedef struct {int* arr;int front;int rear;int k; } MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj(MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj-arr(int*)malloc(sizeof(int)*(k1));obj-frontobj-rear0;obj-kk;return obj; }bool myCircularQueueIsFull(MyCircularQueue* obj);//先声明 bool myCircularQueueIsEmpty(MyCircularQueue* obj);//先声明 bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if (myCircularQueueIsFull(obj))return false;obj-arr[obj-rear]value;obj-rear%obj-k1;return true; }bool myCircularQueueDeQueue(MyCircularQueue* obj) {if (myCircularQueueIsEmpty(obj))return false;obj-front;obj-front%(obj-k1);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;return obj-arr[(obj-rear-1obj-k1)%(obj-k1)]; }bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj-frontobj-rear; }bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj-rear1)%(obj-k1)obj-front; }void myCircularQueueFree(MyCircularQueue* obj) {free(obj-arr);free(obj); } 提交结果 注:有关本题的链表解法参见下一篇
http://www.hkea.cn/news/14569541/

相关文章:

  • 如何网站备案淘客网站模板
  • 建设一个购物网站要多少钱回合网页游戏排行榜前十名
  • 网站宣传页面国内虚拟主机WordPress
  • 网站建站系统教育培训类网站设计
  • 学多久可以做网站 知乎购物网站怎么做优化
  • 办公网站建设哪种语言做网站好
  • 那个网站做外贸100平米美容院装修设计
  • 河北建设工程信息网站内江市网站建设培训
  • 做佣金单网站软件培训机构
  • 顺德网站建设咨询装修公司网站怎么做
  • wordpress 不同页面不同侧边栏青岛seo杭州厂商
  • 百度免费网站建设成全视频在线观看高清版
  • 怎么分析网站的外链建设情况网站顶部怎么做新浪链接
  • 叫人做网站要注意济南网站建设哪家便宜
  • 罗村建网站vi设计找哪家公司
  • 意大利设计网站国内特效网站
  • 杭州商城网站建设清水模板
  • 德维尔全屋定制官方网站wordpress缩略图 裁剪
  • 自主建站系统网上商城怎么推广
  • HTML和PHP怎么做网站wordpress上传后设置
  • 陕西网站建设报价wordpress文章排序错误
  • 网站建设怎么打广告如何做企业网站宣传
  • 网站怎么做边框七台河新闻联播视频
  • 公司做公司网站广告久久建筑网会员登录没有签到得金币了吗
  • 增加网站和接入备案有播放量就有收益的自媒体平台
  • 什么叫网站收录提交深圳成交型网站建设公司
  • 网站建设推广合同书wordpress 显示标题
  • 元素网站企业网站可概括为
  • 微信 绑定网站赣榆区建设局网站
  • 服装网站建设优点有哪些网站建设案例 央视网