如何理解队列,我们可以想象成排队,先进先出。与栈相比的是,栈只支持俩个基本操作: 入栈 push() 和出栈 pop() 。队列和栈很相似,最基本的操作也是俩个: 入队 enqueue() ,将一个数据放在队列尾部; 出队dequeue() ,从队列头部取一个元素。所以,队列和栈一样,也是一中操作受限的线性表数据结构。
顺序队列华为链式队列:
和栈一样,队列可以用数组来实现,也可以用链表来实现。用数组实现的队列叫做顺序队列,用链表实现的队列叫做链式队列。
顺序队列的数据搬移:
在有限的的空间情况下,随着不停地入队、出队操作, head 和 tail 都会持续向后移动。当 tail 移动到最右边,即使数组中还有空闲空间,也无法继续往队列中添加数据了。此时可以使用数据搬移操作,即在出队的时候不进行数据搬移,如果没有空闲空间了,我们在入队的时候集中出发一次数据搬移的操作。
循环队列:
队空的判断条件为: head == tail,队满的条件: (tail+1)%n = head。
阻塞队列和并发队列:
阻塞队列其实是在队列的基础上增加了阻塞操作。简单来说,就是队列为空的时候,从队头读取数据会被阻塞,而队列满了以后,插入数据操作就会被阻塞。这其实就是一个生产者-消费者模型。