这个也是力扣的题目,所以我们还是直接看
请自己看题目
下面就看思路吧,首先是循环队列,我们想一下循环队列如何设计,用什么设计比较好一点,用顺序表还是链表
这里用链表看起来比较简单,因为他是循环的,所以尾节点可以直接连接到头节点就实现了循环队列,但是仔细想一下,前面malloc节点也是一个问题 ,并且malloc到一定的数量就不能再增加了,所以链表并不是一个很明智的选择
所以我们用顺序表实现,可是用顺序表如何实现?他的底层是连接的,那么如何实现循环?
所以我们可以实现逻辑循环就可以,我们可以看一下大概是这个样子
但是这样看起来并不好看,所以我们可以画成这样,看起来好看一点
就是这样,比较好看一点
我们将一下思路,我们可以malloc一个定长大小的空间,然后我们可以定义两个变量,一个front和rear(从名字也能看出来是啥意思),所以我们可以让rear往后走
但是这里的满和空的结果就是一样的了,所以无法判断满和空
所以我们可以多开一个空间,这样就是不一样了
所以这样满的条件就是rear+1%(链表的长度) 是否等于front,如果等于的话就满了,如果没满的话就不等于
如果空的话就是rear等于front
就是这样,所以我们下面看一下实现
就是这样,里面的一个int类型的指针,还有就是rear和front,还有就是capacity这个是用来记录malloc了多少个数据的
下面在看一下
这里是和上一个题是一样的
下面在看一个
看一下判断是否为空 和 是否为满,这个和我们前面说的思想是一样的,就是看是否 rear+1%(链表的长度) 是否等于front,如果等于的话就满了,如果没满的话就不等于
还有就是如果空的话就是rear等于front
就是这样
下面看一下Push
插入就是看是否为满,满了就返回false,否则就插入
我们看一下这个情况,如果是这样的话是可以继续插入的,但是这时候当他到了满了的时候,rear在++的话就超出范围了,所以我们需要在他++结束之后我们需要%一下capacity这就是为什么存他最大存储个数的原因了
所以我们就需要让他%capacity
然后在返回true
这个是删除,首先判断是否为空,为空的话就不能删除
下面就可以正常删除了,我们删除只需要++front就可以了,但是这里也是和Pop的时候是一样的front也可能会这样
如果是这样的话,front++也会超出最大范围,所以也需要%capacity
然后再返回true
下面看一下取front的数据
这里如果为空的话就返回-1
如果不为空的话就返回这个位置的数据
下面在看一下取rear的数据
这里也是如果为空就返回-1
如果不为空,这里还是有两种情况,如果rear为0的话,这里就不能反悔rear -1位置的数据了,因为这里会变成负数,导致报错,所以这里是0的话就需要返回capacity位置的数据,如果他不是0的话就要正常返回rear-1位置的数据就可以了
下面看一下销毁
这里就直接free他里面的a就可以了,然后把里面的其他数据置为0
结束