一、队列
队列(Queue)是一个数据集合,仅允许在列表的一端进行插入,另一端进行删除。
队列性质:先进先出(First-in,First-out)
队列的基本操作:
入队(进队):插入动作。进行插入的一端称为队尾(rear)
出队:删除动作。进行删除的一端成为队头(front)
队列能否用列表简单实现,为什么?
答:简单的用列表来做,如图所示:
当元素出队时,没有用的空间会随着元素的出队而增加,空间开销会变得很大。这种实现方式,不好。简单的用列表来做做不到。
解决方法:把队列头尾连起来,变成循环队列,如图所示:
图一:是个空队列 (rear=front)
图二、三:入队(rear+1)%Maxsize
图四、五:出队(front+1)%Maxsize
注意:当front=11(最大长度)时,要想把front变回0,算法是(front+1)%Maxsize,且无论什么数,对最大长度取余最后都能算出相应位置。所以出队为(front+1)%Maxsize,而不是front+1。同理,入队也是。
图六:如果此时此刻在rear+1这个位置再加一个元素,队满,rear=front,这个时候就会导致我们分不清front=rear到底是队空还是队满,于是决定牺牲一小块空间(如上图空间5),这个时候(rear