循环队列的两种实现
本文,笔者将用一种方式实现一种特殊的队列——循环队列,这个循环队列基于leetcode上的一道算法题:622. 设计循环队列 - 力扣(LeetCode)
数组实现循环链表
这种方法中,我们首先了解循环队列的逻辑:循环队列就是基于FIFO的原则,队尾和队首形成一个循环,可以利用一块同样的空间,类比一下图书馆排队占座位即可。
下面考虑一下循环队列的实现,首先,循环队列满足先进先出的原则,而且是一块有限空间,所以这时候就可以看出雏形了,定义两个指针,一个是head头指针,另外一个是tail指针,但是这个指针不太一样,因为tail这个指针指向的是最后一个位置的下一个位置,而不是最后一个位置,但是如果这样就会有个问题:
如上图所示,流程是首先Push入队,放到tail所在位置,然后tail就往后走,但是head不变,Pop的时候head向右移动一格,tail不变,但是如果head==tail,那么要么空队列,要么满队列,所以这样是错误的,所以要想办法改变这个错误,一般来说有两种方式,笔者在这里展示大多数人使用的方式:额外多开一个空间,进而解决空和满冲突的问题,直接在VS2022中展示:
首先先声明一下接口:
上图就是需要的接口了,下面就来一个一个实现这些接口了。
如上图,这是第一个接口,因为需要多用一个位置,所以就需要令K为k+1,*a就是数组的指针。
这是第二个接口,旨在实现入队的操作,首先得判断一下队列不能满,然后就是把tail视作指针,把新值放在tail所指的位置,在让tail++,最后,如果tail已经到末尾了,那就需要回到0,也就是取模的操作,归根结底就是为了保证越界后绕回起点。