专业的外贸网站建设公司价格,wordpress添加微软雅黑,西安营销型网站,东莞市公共资源交易中心官网目录
【Leetcode622】设计循环队列
A.链接
B.题目再现 C.解法 【Leetcode622】设计循环队列
A.链接
设计循环队列
B.题目再现 C.解法 其实这题用数组或是链表都能解决#xff0c;但是如果是用链表的话#xff0c;那么队列为空的条件和队列满了的条件是一样的#xff0… 目录
【Leetcode622】设计循环队列
A.链接
B.题目再现 C.解法 【Leetcode622】设计循环队列
A.链接
设计循环队列
B.题目再现 C.解法 其实这题用数组或是链表都能解决但是如果是用链表的话那么队列为空的条件和队列满了的条件是一样的都为 frontrear这样就无法判断加个哨兵位的头节点可以解决这个问题但是后面接口的实现又会很麻烦所以这题还是推荐用数组实现。 创建数组时我们多开1个空间也就是开 k1 个空间 具体来说 刚开始队列为空所以 frontrear0 1.插入数据时在下标为 rear 的位置插入然后rear,为了防止下次插入数据时越界rear还要模上 k1 当rear1front即队列满了就不能插入返回false但是这里不能简单地判断 rear1front因为有几种特殊的情况需要注意: 2.删除数据时要先判断队列是否为空若为空则返回false 若不为空只需让front注意这了还是要让front 模上k1防止加着加着就越界了。 3.获取队头数据很简单只需要在此之前判断队列是否为空为空则返回-1 不为空则返回 front 4.获取队尾数据时在此之前同样需要判空若为空则返回-1 若不为空因为 rear 始终表示的是下一个位置所以返回 rear -1但是如果 rear 的值是0的话rear-1-1访问就越界了这个特殊的情况需要注意或者不单独判断这个特殊情况直接先让rear-1再加上k1然后模上k1返回其结果这样即使rear是0也不会造成越界访问。 5.判空很简单只需判断 rear 是否等于 front 即可。 typedef struct {int *arr;int front;int rear;int k;
} MyCircularQueue;bool myCircularQueueIsFull(MyCircularQueue* obj)
{//不能简单地判断rear1front即为满要考虑特殊情况return ((obj-rear1)%(obj-k1))(obj-front);
}bool myCircularQueueIsEmpty(MyCircularQueue* obj)
{if(obj-frontobj-rear)return true;elsereturn false;
}
MyCircularQueue* myCircularQueueCreate(int k)
{MyCircularQueue*obj(MyCircularQueue*)malloc(sizeof(MyCircularQueue));if(objNULL)return NULL;obj-frontobj-rear0;obj-kk; //这里记录k的值后面的接口需要用到obj-arr(int *)malloc(sizeof(int)*(k1)); //开 k1 个空间if(obj-arrNULL)return NULL;return obj;
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)
{if(myCircularQueueIsFull(obj)) //队列为满则返回falsereturn false;obj-arr[obj-rear]value;obj-rear%(obj-k1); //防止 rear 加着加着就越界了return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj)
{if(myCircularQueueIsEmpty(obj)) //队列为空则返回falsereturn false;obj-front;obj-front%(obj-k1); //防止 front 加着加着就越界了return true;
}int myCircularQueueFront(MyCircularQueue* obj)
{if(myCircularQueueIsEmpty(obj)) //队列为空则返回-1return -1;return obj-arr[obj-front];
}int myCircularQueueRear(MyCircularQueue* obj)
{if(myCircularQueueIsEmpty(obj))return -1;//rear表示的是下一个位置所以队尾数据的下标时rear-1但要考虑rear0 这一特殊情况return obj-arr[(obj-rear-1obj-k1)%(obj-k1)];
}void myCircularQueueFree(MyCircularQueue* obj)
{free(obj-arr); //先销毁创建的数组free(obj);
}这循环队列的讲解就到这里了若有错误或是建议欢迎小伙伴们指出。 希望小伙伴们可以多多支持博主哦。 谢谢你的阅读。