前言
队列是一种先进先出的数据结构,也是常见的数据结构之一。日常生活中的排队买东西就是一种典型的队列,而在购票系统也需要一个队列处理用户的购票请求,当然这里的队列就复杂多了。本文介绍队列的基本概念和实现。
队列常见操作
队列最常见的操作是入队和出队,拿排队买东西来说,入队就是新来一个人排在队伍后面,而出队就是一个人已经结账离开。
队列基本实现考虑
与实现栈不同,它需要两个指针,一个指向队头(front),一个指向队尾(rear),这样才能方便地进行入队或出队操作,因此队列的实现要比栈难一些。在说明如何实现一个队列之前,先看实现一个队列可能需要注意哪些问题。
假如我们使用数组按照实现栈的方式来实现队列。并且队列中的数据如下:
0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
10 | 11 | 12 | 13 | 14 |
front | rear |
这个时候从队头front处删除一个数据,是很容易的。
0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
11 | 12 | 13 | 14 | |
front | rear |
但是如果要入队一个数据呢?这个时候发现队尾已经没有空间了,为了入队一个元素,必须将所有元素都往队头移动,这似乎很符合我们排队的习惯,前面一个人走了,后面的人都往前一个位置。但是在数组中,将所有的元素都往队头移动的开销是不容忽略的!
有人可能已经注意到了,原来删除的地方还有一个空位呢,不如把新的元素加入到这里,然后将尾指针rear指向该处即可。没错,这就相当于把该数组当成了一个循环数组,即可以看成数组尾部和头部是连着的。这个时候就变成了下面的情况:
0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
15 | 11 | 12 | 13 | 14 |
rear | front |
此时,队列是满的,rear指向下标0处,而front指向下