图 5 当 tail 超出数组位置时,会被重新标记为 0那么在入队 E、F 元素时,存储结构会如图 6 所示。图 6 继续入队 E、F 元素
当前 head 为 0 时,tail 为 3。接下来进行出队操作,出队一个元素,head 指向的位置则加 1。比如进行一次出队操作之后,顺序队列的存储情况如图 4 所示。
一般而言。我们在对 head 或者 tail 加 1 时,为了方便,可直接对结果取余数组长度,得到我们需要的数组长度。另外由于顺序队列存在“假上溢”的问题,所以在实际使用过程中都是使用循环队列来实现的。
”;如果队列是空的,则执行出队操作,这时队列里没有元素,不能出队,我们称之为“
因此,在顺序队列中,队列中元素的个数我们可以用 tail 减去 head 计算。当 head 与 tail 相等时,队列为空队,当 tail 达到数组长度,也就是队列存储之外的位置时,说明这个队列已经无法再容纳其他元素入队了。空间是否都满了?并没有,由于两个标记都是只增不减,所以两个标记最终都会到数组的最后一个元素之外,这时虽然数组是空的,但也无法再往队列里加入元素了。
。这里又提到了链表,我们暂时先不做讲解。用数组实现队列有两种方式,一种是用数组实现队列,若出现队列满了的情况,则这时就算有新的元素需要入队,也没有位置。此时一般的选择是要么丢掉,要么等待,等待的时间一般会有程序控制。
图 2 顺序队列的初始情况在插入元素之后,tail 标记就会加1,比如入队三个元素,分别为 A、B、C,则当前标记及存储情况如图 3 所示。
当顺序队列出现假上溢时,其实数组前端还有空间,我们可以不用把标记指向数组外的地方,只需要把这个标记重新指向开始处就能解决。想象一下这个数组首尾相接,成为一个圈。存储结构还是之前提到的,在一个数组上。此时,如果当前队列中元素的情况如图 5 所示:
顺序队列的存储结构如图1 所示。图 1 顺序队列的存储结构顺序队列会有两个标记,一个是队头位置(head),一个是下一个元素可以插入的队尾位置(tail)。一开始两个标记都指向数组下标为 0 的位置,如图 2 所示。
但是循环队列中会出现这样一种情况:当队列没有元素时,head 等于 tail,而当队列满了时,head 也等于 tail。为了区分这两种状态,一般在循环队列中规定队列的长度只能为数组总长度减 1,即有一个位置不放元素。因此,当 head 等于 tail 时,说明队列为空队,而当 head 等于(tail+1)%length 时(length 为数组长度),说明队满。
近期评论