凌河建设网站,网络服务示范区创建情况,wordpress火车头接口定时,网页模版素材循环队列是我们可以对队列有更深一步的理解的题目#xff0c;而且可以进一步加强其他方面的知识#xff08;例如对循环数组的取模运算#xff0c;指针的解引用#xff09;#xff0c;是个蛮不错的巩固习题#xff0c;话不多说#xff0c;进入正题。 链接在此#xff1…循环队列是我们可以对队列有更深一步的理解的题目而且可以进一步加强其他方面的知识例如对循环数组的取模运算指针的解引用是个蛮不错的巩固习题话不多说进入正题。 链接在此设计循环队列 强烈建议先自己做一遍直接看的话可能会比较不知所云 目录 利用数组设计思路代码实现 利用链表设计思路代码实现 本题可以使用
数组或链表来设计本篇文章都会涉及到 做这题时会遇到很多难点 先说结论此题的难点在于如何判断数组的
空与满不管是链表还是数组实现此问题都是难点。 在数据结构中我们通常在解决此问题时都是选择多设置一个位置back指向当前元素的下一个。 但多出来的位置不是不用例如 这样可以比较好的解决此类问题。
利用数组设计
思路
已经有了上述的前置知识 我们就可以比较轻易地判断空与满数组中的front和back下标指向同一个位置时是空那么什么时候会满呢 当back的下一个为front时就为满即back1 front 但是如果back在front后边就需要我们的比较灵活的运用取模运算 在上边我们说到back1 front时为满但是在上图中我们发现back1并不是front而是超出了数组 我们说过会定义N1个空间N是元素个数经过思考我们会发现N就是back的下标N1就是back1位置的下标 那我们back 1% (N 1) front时就是满 代码中剩下的取模运算也都大同小异
代码实现
typedef struct {int* arr;int front;int rear;int N;
} MyCircularQueue;bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return (obj-front obj-rear);
}bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj-rear 1 ) % (obj-N 1) obj-front;
}MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* ret (MyCircularQueue*)malloc(sizeof(MyCircularQueue));ret-arr (int*)malloc(sizeof(int)*(k1));ret-front 0;ret-rear 0;ret-N k;return ret;
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj)){return false;}obj-arr[obj-rear] value;obj-rear;//防止rear出界obj-rear % (obj-N 1);return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj)){return false;}obj-front;//防止front出界obj-front % (obj-N 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;}//此处可以不用取模if与else判断也可以return obj-arr[(obj-rear-1(obj-N1))%(obj-N1)];
}void myCircularQueueFree(MyCircularQueue* obj) {free(obj-arr);free(obj);
}/*** 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);
*/一一一一一一一一分割线一一一一一一一一 持续更新中…
利用链表设计
思路
代码实现