Queue和Stack有一些类似,不同的是Stack是先进后出,而Queue是先进先出。Queue在生活中的例子比如排队上公交,排在第一个的总是最先上车;又比如打印机的打印队列,排在前面的最先打印。
- Queue一般具有以下常见方法:
- enqueue:入列,向队列尾部增加一个元素
- dequeue:出列,移除队列头部的一个元素并返回被移除的元素
- front:获取队列的第一个元素
- isEmpty:判断队列是否为空
- size:获取队列中元素的个数
数组实现
Javascript中的Array已经具备了Queue的一些特性,所以我们可以借助Array实现一个Queue类型:
简单实现
-
定义循环变量 front 和 rear:
- front 指向队列头部第 1 个有效数据的位置;
- rear 指向队列尾部(即最后 1 个有效数据)的下一个位置,即下一个从队尾入队元素的位置;
-
为了避免「队列为空」和「队列为满」的判别条件冲突,有意浪费了一个位置:
- 判别队列为空的条件是:
front == rear
;
- 判别队列为满的条件是:
(rear + 1) % capacity == front
;可以这样理解,当 rear 循环到数组的前面,要从后面追上 front,还差一格的时候,判定队列为满;
-
因为有循环的出现,要特别注意处理数组下标可能越界的情况;指针后移的时候 下标 +1 ,并且为了防止数组下标越界要取模;
测试代码
Priority Queue(优先队列)
Queue还有个升级版本,给每个元素赋予优先级,优先级高的元素入列时将排到低优先级元素之前。区别主要是enqueue方法的实现:
测试代码
结果为:
扩展阅读