队列的定义
队列是只允许在一端进行插入操作,另一端进行删除操作的线性表。
队列是一种 “先进先出” 的线性表,简称FIFO。允许插入的一端是队尾,允许删除的一端是队头。
1.循环队列–顺序存储
底层还是用数组来实现,但是需要两个指针,一个是队头指针,一个是队尾指针,当队头和队尾指向同一个位置时,表示当前的队列是空队列,如果有数据插入的话,可以直接向后移动队尾指针,如果有数据要删除的话,可以直接移动队头指针。在具体结构中还存放一个size,表示当前队列中的个数。下面说当队头指针和队尾指针相遇时就是队列是空,其实不严谨,只有当size为0的时候队列为空,因为如果队列满了,队头和队尾也会相遇,这两种情况下队头指针和队尾指针会指向同一块地址。
如果队尾指针移动超过n了怎么办,很简单如果超过数组范围了,我们就指向开头,如果开头和头指针相遇,size == n,说明空间不够了,那么我们就需要开辟一个更大的空间,然后将数据重新拷贝到新空间中,释放旧空间,再去移动队尾指针。
顺序存储还是会出现空间不足,开辟新空间后,移动数据的过程,那么我们来分析下链式存储。
2.队列的链式存储
链式存储,需要的话就去开辟新空间,不需要的话就释放删除的节点空间,按需索取,不用担心数组越界的问题,只有在我们申请不到新空间的时候才会插入失败。