队列:队列是一种先进先出(FIFO)的线性表,允许插入的一端为队尾,允许删除的一端为队头。
循环队列----解决"假溢出"
除了特别说明外,循环队列通常是指顺序存储结构,而不是链式存储结构。
若队列的最大尺寸为QueueSize,队列空:front=rear
队列满:(rear+1)%QueueSize==front
通用的计算队列长度的公式为:
(rear-front+QueueSize)%QueueSize
循环队列顺序存储
入队列:在队尾追加一个元素,无需移动,时间复杂度O(1).
出队列:在队头,保证下标为0的位置不为空,时间复杂度O(n)。
引入两个指针,front指队头,rear指队尾元素的下一个位置。
front=rear时,此队列为空列。
循环队列链式存储
队头指针指向链队列的头结点,队尾指针指向终端结点。
空队列时,front和rear都指向头结点。
链队列的性质(尾指针的单循环链表)
”头出尾插“的单链表,即仅在表头进行删除操作和表尾进行插入操作的单链表。
1)插入时:尾插法,且遵循尾改,头不改。
2)删除时:头出法,且遵循头改,尾不改,但当删除最后一个元素时,首尾都要改。
对于循环队列的入队和出队求元素个数的运算都要用取模运算。
入队:新元素位置rear=(rear+1)%m
出队:front=(front+1)%m
队空:front=rear
队满:(rear+1)%m=front,m是队列长度
注意:有关循环队列,关于对头队尾指针的指向,多数教材约定,队头指针指向队头元素的前一位置,队尾指针指向队尾元素,也有教材规定队头指针元素,队尾指针指向队尾元素的后一位置。