队列是一种先进先出的数据结构,单调指的是数学中的单调性,包括严格的递增或者递减。
单调队列指的就是严格符合单调性的队列,它有两个性质:
1、对于单调递增队列,从队头到队尾的元素在某种比较标准下是严格递增的,比如q(1, 2, 3, 4, 5)。对于单调递减队列,从队头到队尾的元素在某种比较标准下是严格递减的,比如q(5, 4, 3, 2, 1)。
2、排在前面的元素必定比排在后面的元素先进队。
这两个性质都很简单,但不能为了符合性质2而破坏性质1,若当前队列是q(1, 2, 3, 5),下一个进队元素是4,则不能把4放到5的前面,变成q(1, 2, 3, 4, 5),这样就不符合性质2了。
元素的入队方法:对于单调递增队列,设当前准备入队的元素为e,从队尾开始把队列中的元素逐个与e对比,把比e大或者与e相等的元素逐个删除,直到遇到一个比e小的元素或者队列为空为止,然后把当前元素e插入到队尾。对于单调递减队列也是同样道理,只不过从队尾删除的是比e小或者与e相等的元素。
若队列有大小限制,则每次插入新元素的时候,需要从队头开始弹出元素,直到队列至少有一个空间留给当前元素。
以下是一个单调递增队列的例子:
队列大小不能超过3,入队元素依次为3,2,8,4,5,7,6,4
3入队:(3)
3从队尾出队,2入队:(2)
8入队:(2,8)
8从队尾出队,4入队:(2,4)
5入队:(2,4,5)
2从队头出队,7入队:(4,5,7)
7从队尾出队,6入队:(4,5,6)
6从队尾出队,5从队尾出队,4从队尾出队,4入队:(4)
以上左端为队头,右端为队尾。从队尾出队是为了符合性质2,从队头出队是为了符合队列的大小限制。