队列(quene),或成为队,也是一种容器,可存入元素,访问元素,删除元素。
队列中也没有位置的概念,只支持默认方式的元素存入和取出。
特点就是在任何时候访问或删除的元素,都是在此之前最早存入队列而至今未删除的那个元素,因此队列也是先进先出(FIFO)
队列的操作也是一个封闭集合,通常包括:创建新队列对象(如创建空队列);判断队列是否为空(还可能需要判断满),将一个元素放入队列(一般称为入队,enquene);从队列中删除一个元素并返回它(称为出队,dequene),查看队列里当前元素(最老的)元素(但是不删除)
1 队列的链接表实现
队列操作要求先进先出,从线性顺序看,这要求在表单两端进行操作,不像栈那样在表的一端进行操作,所以实现起来也稍微麻烦一点。
由于要在链接表的两端进行操作,从一端插入元素,从另一端删除。最简单的单链表只支持首端高效操作,在另一端操作需要O(n)时间,不适合作为队列的实现基础。
但是,带表尾端指针的单链表,它支持O(1)时间的尾端插入操作。再加上表首端的高效访问和删除,基于单链表实现队列的技术已经很清晰了,如图所示。
有了尾端指针,尾端加入元素操作是O(1)时间操作,可以用作队列的入队操作enquene, 首端访问和删除都是O(1)时间操作,分别看做队列的peak 和 dequene
由此可见,单链表的技术和实现可以直接用于队列,只需要修改几个重要的名字,把append 改为enquene,pop 改为 dequene, 将top 改为peek 等,都是O(1)时间操作。
2 队列的顺序表实现
首先假设用顺序表的尾端插入实现enquene操作,根据队列的性质,出队操作应该在首端进行,为了维护顺序表的完整性(表元素在表前端连续存放),出队操作取出当时的首元素后,就需要把表中其余元素全部前移,这样将得到一个O(n)时