国内域名网站有那些,wordpress网站如何添加内链,四库一平台建造师业绩查询,免费做网站怎么盈利云边有个稻草人-CSDN博客 必须有为成功付出代价的决心#xff0c;然后想办法付出这个代价。 还有最后一道关于队列的习题#xff0c;这题有点难#xff0c;准备好迎接挑战吧#xff01;
目录
1.【题目】
2.实现循环队列推荐用数组#xff0c;Why?
3.Q1#xff1a;如…云边有个稻草人-CSDN博客 必须有为成功付出代价的决心然后想办法付出这个代价。 还有最后一道关于队列的习题这题有点难准备好迎接挑战吧
目录
1.【题目】
2.实现循环队列推荐用数组Why?
3.Q1如何来判断队列是满的
4.上代码
5.【注意】 这题得多画图理解不能空想而且要结合我写代码中穿插的注释这样就会好理解点
1.【题目】 2.实现循环队列推荐用数组Why? 链表如果像我们实现队列一样使用链表定义两个指针phead为头删除数据ptail为尾插入数据一开始每次插入数据都要申请节点在队列满了之后我们在队头删除数据之后再要插入数据时我们就要判断要插入的节点数据是否为空节点虽在但内容数据被删掉了此时需要status来存储节点的状态记录空还是非空比较麻烦。
数组直接申请一块连续的空间不需要像链表那样不断申请结点也不需要指针来指来指去。定义两个变量front 和 rear 分别指向队头和队尾往 rear 指向的位置插入数据之后 rear在 front 指向的位置删除数据之后 front。大体思路就是这样操作比链表要简单。但是还有很多细节需要去补充调整接下来跟着我的思路开始。 3.Q1如何来判断队列是满的
一开始 front 和 rear 都指向下标为0的位置此时队列为空每插入一次数据 rear 都要指向下一个位置因为是循环队列所以当队列插满的时候 rear 和 front 指向同一个位置 这时我们发现队列满时和队列为空时都是 rear front 那么该如何分辨队列满和为空时
A1如上图所示我们多申请一个空间一开始 front 和 rear 还是指向同一个位置此时front 和 rear 相等循环队列为空假如我们要插入4k个数据为满插入完最后一个数据时 rear 指向多申请的那个空间此时队列满了按照rear1% k1 front为满这样我们就可以分清何时为满何时为空了。 4.上代码
//创建循环队列的结构
typedef struct {int* arr;int front;int rear;int capacity;
} MyCircularQueue;//初始化循环队列
MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* pst (MyCircularQueue*)malloc(sizeof(MyCircularQueue));pst-arr (int*)malloc(sizeof(int)*(k1));pst-front pst-rear 0;pst-capacity k;return pst;
}//判断队列是否为满
bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj-rear1) % (obj-capacity1) obj-front;
}//向循环队列里面插入数据
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj)){return false;}obj-arr[obj-rear] value;//防止rear越界obj-rear % obj-capacity1;return true;
}//判断循环队列是否为空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj-front obj-rear;
}//删除元素
bool myCircularQueueDeQueue(MyCircularQueue* obj) {//队列不为空if(myCircularQueueIsEmpty(obj)){return false;}obj-front;//防止front越界obj-front % obj-capacity1;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];//但是当rear 0时指向队头第一个位置时rear-1 -1//此时出现错误,需要我们特殊处理一下int prev obj-rear-1;if(prev -1){prev obj-capacity;}return obj-arr[prev];
}//销毁
void myCircularQueueFree(MyCircularQueue* obj) {free(obj-arr);obj-arr NULL;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);
*/ 5.【注意】
在取队尾元素的时候是取 rear-1 指向的元素若 rear-1 -1我们就需要特殊处理一下具体详见代码。在实现操作的时候我们要注意 front 和 rear 不能越界obj-front % obj-capacity这样之后就从越界的位置变成下标为0的位置如果没有越界这样操作也不会改变 front 和 rear 的原始值。我们申请的空间是比要存储数据的空间多一个。我们定义一个 capacity 来保存要存储有效数据的个数。 这道题还是比较难的我们需要多多思考细节思路回顾敲代码。
完—— Look4You_Alberto Ciccarini、Beatrich_高音质在线试听_Look4You歌词|歌曲下载_酷狗音乐
你真的会点开我精心分享给你的歌吗 至此结束
我是云边有个稻草人
期待与你的下一次相遇。。。