哈尔滨关键词优化排行,企业seo顾问,如何建设网站推广平台,如何更改wordpress登录密码错误目录 一、前言
1.如何实现循环#xff1f;
2.如何判断队列为空#xff1f;
3.如何判断队列为满#xff1f;
二、循环队列的结构定义
三、循环队列的创建及其初始化
四、入队
五、出队
六、取队头元素
七、取队尾元素
八、判空
九、判满
十、销毁队列 一、前言
…目录 一、前言
1.如何实现循环
2.如何判断队列为空
3.如何判断队列为满
二、循环队列的结构定义
三、循环队列的创建及其初始化
四、入队
五、出队
六、取队头元素
七、取队尾元素
八、判空
九、判满
十、销毁队列 一、前言
利用数组实现循环队列重点要解决的问题有三个
1.如何实现循环
由于数组大小k是确定的要实现队列循环就需要让数组下标循环利用两个下标front、back分别指向首元素和尾元素的下一个位置。front (front1) % kback (back1) % k即可完成下标的循环。
2.如何判断队列为空
初始化时front和back都为0此时为空。因此我们确定判空条件为 front back时循环队列为空。
3.如何判断队列为满
我们发现当队列满时由于back指向队尾元素的下一个因此队列满时front back 与队列空时相矛盾。如何解决呢
两种解决方法
一是循环队列结构中新增队列大小 size 当size0且front back时队列为空当size≠0且front back时队列为满。
二是新增一个空间不存储数据front (front1) % (k1)back (back1) % (k1)当 (back1) % (k1) front时队列为满。
本文仅讲解方法二方法一详见数组实现循环队列增设队列大小size-CSDN博客
二、循环队列的结构定义
循环队列结构中包括数组、头指针、尾指针、队列容量
//方法二
//循环队列的结构定义
typedef int MCQDataType;typedef struct {MCQDataType *a;//数组int front;//头指针指向队头元素int back;//尾指针指向队尾元素的下一个位置int k;//循环队列容量
} MyCircularQueue;
三、循环队列的创建及其初始化
首先动态申请一个循环队列结构体的内存空间然后为数组动态申请k1个内存空间并将头指针、尾指针都初始化为0队列容量初始化为k。
//方法二
//循环队列的创建及其初始化
MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue *mcq(MyCircularQueue*)malloc(sizeof(MyCircularQueue));mcq-a(MCQDataType*)malloc(sizeof(MCQDataType)*(k1));mcq-kk;mcq-frontmcq-back0;return mcq;
}
四、入队
先判断队列是否为满不满则入队同时尾指针要 加1模(k1) back (back1) % (k1)
//方法二
//入队
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if((obj-back1)%(obj-k1)obj-front)//满队列{return false;}obj-a[obj-back]value;obj-back(obj-back1)%(obj-k1);return true;
}
五、出队
先判断队列是否为空不空则出队同时头指针要 加1模(k1)front (front1) % (k1)
//方法二
//出队
bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(obj-frontobj-back)//空队列{return false;}obj-front(obj-front1)%(obj-k1);return true;
}
六、取队头元素
先判断队列是否为空不空则返回头指针指向的元素
//方法二
//取队头元素
int myCircularQueueFront(MyCircularQueue* obj) {if(obj-frontobj-back)//空队列{return -1;}return obj-a[obj-front];
}
七、取队尾元素
先判断队列是否为空不空再判断尾指针的位置
如果尾指针指向0位置则队尾元素在数组最后一位即k的位置因为总共开辟了k1个空间
如果尾指针不指向0位置那么队尾元素位置是back-1。
//方法二
//取队尾元素
int myCircularQueueRear(MyCircularQueue* obj) {if(obj-frontobj-back)//空队列{return -1;}if(obj-back0){return obj-a[obj-k];//重点}else{return obj-a[obj-back-1];}
}
八、判空
判空条件是 front back
//方法二
//判空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj-backobj-front;
}
九、判满
判满条件是 (back1)%(k1) front
//方法二
//判满
bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj-back1)%(obj-k1)obj-front;
}
十、销毁队列
动态申请的内存空间都要动态销毁free
//方法二
//销毁循环队列
void myCircularQueueFree(MyCircularQueue* obj) {free(obj-a);free(obj);
}