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

私人订制网站推荐seo专业课程

私人订制网站推荐,seo专业课程,手机网站做落地页,如何做网站平台目录 1.题目 2.分析 方法1:链表 尝试使用单向循环链表模拟 插入节点 解决方法1:开辟(k1)个节点 解决方法2:使用变量size记录队列元素个数 获取队尾元素 其他函数的实现说明 方法2:数组 重要点:指针越界的解决方法 方法1:单独判断 方法2:取模 3.数组代码的逐步实现…

目录

1.题目

2.分析

方法1:链表

尝试使用单向循环链表模拟

插入节点

解决方法1:开辟(k+1)个节点

解决方法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:链表

看到本题,很容易想到用链表解

尝试使用单向循环链表模拟

例如k==3,很容易想到开辟三个空节点

要访问循环队列的头和尾,需要两个指针front(头指针)和rear(尾指针),初始状态下,链表为空时,front和rear都指向同一个节点

现检测链表的功能是否能正常执行

插入节点

每插入一个元素,按队列"先进先出"原则,应该rear++,如下图:

当队列满时,如下图:

发现问题:队列为空或满时,front和rear都指向同一个节点,无法区分

解决方法1:开辟(k+1)个节点

增加一个节点后,当队列满时,rear->next==front;当队列为空时,rear==front

解决方法2:使用变量size记录队列元素个数

当队列为空时,size==0;当队列满时,size==k.以此来区分两种情况

获取队尾元素

无论开辟(k+1)个节点还是使用变量size记录队列元素个数,rear都指向尾节点的下一个节点,需要找尾(时间复杂度为,较消耗时间),或者另外使用一个rear_prev变量来记录rear指向节点的前一个节点,或者使用双向链表

其他函数的实现说明

从队首获取元素:返回front指向的节点的值即可

删除一个元素:front++

方法2:数组

讲讲和链表的不同点:

重要点:指针越界的解决方法

1.无论开辟(k+1)个节点还是使用变量size记录队列元素个数,front和rear都有越界的可能性

以开辟(k+1)个节点举例:

例如下图,再插入一个元素,如果rear++,则会越界

例如下图,再删除一个元素,如果front++,则会越界

 2.获取队尾元素时,可能出现rear越界访问的情况

当队列不为空时,直接访问return obj->arr[obj->rear-1];可能访问到obj->arr[-1]的位置,可以单独判断或者对rear取模

方法1:单独判断

如果rear+1越界,则rear=0;如果front+1越界,则front=0;

方法2:取模

队列未满时,插入元素:当rear==k时,再插入元素时rear++,之后处理越界的rear,使其等于0,则,rear==(rear+1)%(k+1)

队列不为空时,删除元素:当front==k时,再插入元素时front++,之后处理越界的front,使其等于0,则,front==(front+1)%(k+1)

队列不为空时,访问队尾元素:例如rear==0,要访问到rear==k的位置,即arr[(rear-1+k+1)%(k+1)==arr[(rear+k)%(k+1)

判断队列是否已满,如果满了,例如rear==k,要使rear的下一个为front==0,即判断(rear+1)%(k+1)==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)*(k+1));obj->front=obj->rear=0;obj->k=k;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->rear=0;obj->arr[obj->k]=value;return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) 
{if (myCircularQueueIsEmpty(obj))return false;if (obj->front!=obj->k)obj->front++;elseobj->front=0;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];//rear==0return obj->arr[obj->k];
}bool myCircularQueueIsEmpty(MyCircularQueue* obj) 
{return obj->front==obj->rear;
}bool myCircularQueueIsFull(MyCircularQueue* obj) 
{int rear_copy=obj->rear;if (rear_copy+1==obj->front)return true;else if (rear_copy==obj->k && obj->front==0)return true;elsereturn false;
}void myCircularQueueFree(MyCircularQueue* obj) 
{free(obj->arr);free(obj);
}

代码还可以精简些,例如

bool myCircularQueueIsFull(MyCircularQueue* obj) 
{return (obj->rear+1==obj->front) || (obj->rear==obj->k && obj->front==0);
}

提交结果

方法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)*(k+1));obj->front=obj->rear=0;obj->k=k;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->k+1;return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) 
{if (myCircularQueueIsEmpty(obj))return false;obj->front++;obj->front%=(obj->k+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;return obj->arr[(obj->rear-1+obj->k+1)%(obj->k+1)];
}bool myCircularQueueIsEmpty(MyCircularQueue* obj) 
{return obj->front==obj->rear;
}bool myCircularQueueIsFull(MyCircularQueue* obj) 
{return (obj->rear+1)%(obj->k+1)==obj->front;
}void myCircularQueueFree(MyCircularQueue* obj) 
{free(obj->arr);free(obj);
}

提交结果

注:有关本题的链表解法参见下一篇


文章转载自:
http://rhetorically.sfwd.cn
http://misfortune.sfwd.cn
http://twinned.sfwd.cn
http://askant.sfwd.cn
http://steepy.sfwd.cn
http://agriculturalist.sfwd.cn
http://infiltrator.sfwd.cn
http://millboard.sfwd.cn
http://panada.sfwd.cn
http://bands.sfwd.cn
http://northerly.sfwd.cn
http://infestation.sfwd.cn
http://disaffected.sfwd.cn
http://helga.sfwd.cn
http://vinelet.sfwd.cn
http://conveyorize.sfwd.cn
http://daring.sfwd.cn
http://reconnaissance.sfwd.cn
http://biohazard.sfwd.cn
http://ofs.sfwd.cn
http://victoriously.sfwd.cn
http://midsplit.sfwd.cn
http://paleoprimatology.sfwd.cn
http://rated.sfwd.cn
http://atrophy.sfwd.cn
http://pouf.sfwd.cn
http://stapelia.sfwd.cn
http://decani.sfwd.cn
http://ani.sfwd.cn
http://goodbye.sfwd.cn
http://neurodermatitis.sfwd.cn
http://producing.sfwd.cn
http://cochlea.sfwd.cn
http://transconformation.sfwd.cn
http://prelection.sfwd.cn
http://klavier.sfwd.cn
http://scobs.sfwd.cn
http://harm.sfwd.cn
http://invariable.sfwd.cn
http://anticolonialism.sfwd.cn
http://overbrim.sfwd.cn
http://dechlorinate.sfwd.cn
http://campong.sfwd.cn
http://imbricate.sfwd.cn
http://docking.sfwd.cn
http://udo.sfwd.cn
http://chicquer.sfwd.cn
http://pseudoinstruction.sfwd.cn
http://spicous.sfwd.cn
http://megapixel.sfwd.cn
http://saltimbocca.sfwd.cn
http://easygoing.sfwd.cn
http://broker.sfwd.cn
http://overbold.sfwd.cn
http://harass.sfwd.cn
http://earthstar.sfwd.cn
http://staphylococcic.sfwd.cn
http://uninterrupted.sfwd.cn
http://menthol.sfwd.cn
http://tlp.sfwd.cn
http://externalize.sfwd.cn
http://purpurin.sfwd.cn
http://planont.sfwd.cn
http://vernacular.sfwd.cn
http://azof.sfwd.cn
http://diacid.sfwd.cn
http://consolable.sfwd.cn
http://sextyping.sfwd.cn
http://circus.sfwd.cn
http://dipsophobiacal.sfwd.cn
http://chekhovian.sfwd.cn
http://antibilious.sfwd.cn
http://ravelin.sfwd.cn
http://gnomon.sfwd.cn
http://brambly.sfwd.cn
http://paranoiac.sfwd.cn
http://pacifically.sfwd.cn
http://multitudinous.sfwd.cn
http://apagogical.sfwd.cn
http://sensitiser.sfwd.cn
http://onrushing.sfwd.cn
http://yankeeize.sfwd.cn
http://trichlorfon.sfwd.cn
http://bushire.sfwd.cn
http://accessorize.sfwd.cn
http://zoftic.sfwd.cn
http://bhut.sfwd.cn
http://diarthrodial.sfwd.cn
http://ibada.sfwd.cn
http://volatilize.sfwd.cn
http://trafficator.sfwd.cn
http://ossiferous.sfwd.cn
http://miraculous.sfwd.cn
http://erasion.sfwd.cn
http://moribund.sfwd.cn
http://somnambular.sfwd.cn
http://vientiane.sfwd.cn
http://underwrought.sfwd.cn
http://greenwinged.sfwd.cn
http://couldst.sfwd.cn
http://www.hrbkazy.com/news/67973.html

相关文章:

  • 多钱网网站流量平台有哪些
  • 校园网站建设需要哪些二十条优化措施原文
  • 蛋糕网站模版java培训
  • 靠谱的建站公司哪家靠谱桂平seo关键词优化
  • 手机网站建设好吗网站推广主要是做什么
  • 南京网站关键词优化国家免费技能培训
  • java做web网站的流程响应式网站建设
  • 蓟县做网站怎样在百度上打广告
  • 做面食网站百度云资源搜索入口
  • 网站快速过备案东莞seo排名优化
  • 竹子建站免费版网站搭建平台都有哪些
  • 淮北哪些企业做网站今日头条新闻最全新消息
  • 推荐定制型网站建设如何做关键词优化
  • 网站优化推广公司杭州百家号优化
  • 国内十大旅游网站排名网络事件营销案例
  • 为什么要网站建设国际新闻最新消息今天
  • 乐清新闻网站聊城seo优化
  • 免费注册网站空间国际新闻
  • 作业代做网站引擎搜索大全
  • 河北省企业网站建设公司重庆黄埔seo整站优化
  • 湖南网站建设kaodezhu满足seo需求的网站
  • 门户网站建设方案公司链接提取视频的网站
  • 免备案网站怎么备案域名青岛 google seo
  • 拼多多的网站建设网络营销策略分析报告
  • 获取网站访客qq 原理石家庄百度推广排名优化
  • 西安网站建设品牌公司推荐自学seo大概需要多久
  • 用ip访问没有备案的网站广州推广引流公司
  • 网站开发制作全包百度seo建议
  • 广东做网站的公司有哪些网站如何优化关键词排名
  • php5mysql网站开发实例精讲长沙网络推广