博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单调栈与单调队列
阅读量:4931 次
发布时间:2019-06-11

本文共 1191 字,大约阅读时间需要 3 分钟。

单调栈与单调队列很相似,单调性指的是严格的递增或者递减。

 

单调栈有以下两个性质:

1、若是单调递增栈,则从栈顶到栈底的元素是严格递增的。若是单调递减栈,则从栈顶到栈底的元素是严格递减的。

2、越靠近栈顶的元素越后进栈。

单调栈与单调队列不同的地方在于栈只能在栈顶操作,因此一般在应用单调栈的地方不限定它的大小,否则会造成元素无法进栈。

元素进栈过程:对于单调递增栈,若当前进栈元素为e,从栈顶开始遍历元素,把小于e或者等于e的元素弹出栈,直接遇到一个大于e的元素或者栈为空为止,然后再把e压入栈中。对于单调递减栈,则每次弹出的是大于e或者等于e的元素。

一个单调递增栈的例子:

进栈元素分别为3,4,2,6,4,5,2,3

3进栈:(3)

3出栈,4进栈:(4)

2进栈:(4,2)

2出栈,4出栈,6进栈:(6)

4进栈:(6,4)

4出栈,5进栈:(6,5)

2进栈:(6,5,2)

2出栈,3进栈:(6,5,3)

以上左端为栈底,右端为栈顶。

 

 

 

队列是一种先进先出的数据结构,单调指的是数学中的单调性,包括严格的递增或者递减。

单调队列指的就是严格符合单调性的队列,它有两个性质:

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,从队头出队是为了符合队列的大小限制。

转载于:https://www.cnblogs.com/blythe/p/7421406.html

你可能感兴趣的文章
vuex使用方法
查看>>
eclipse添加easyExport插件,打开本地文件
查看>>
Docker CE 安装
查看>>
HR面试总结
查看>>
Yahoo!团队:网站性能优化的35条黄金守则(转)
查看>>
redis 基本操作
查看>>
Windows下安装Redis服务
查看>>
Sublime的Package Control的安装
查看>>
【HDOJ】2155 小黑的镇魂曲
查看>>
Mininet实验 脚本实现控制交换机行为
查看>>
c# 获取程序运行的根目录
查看>>
Java之匿名内部类详解
查看>>
adb 命令模拟按键事件
查看>>
Codeforces Round #436 D. Make a Permutation!
查看>>
scp的使用
查看>>
React组件绑定this的四种方式
查看>>
Jquery操作select
查看>>
利用Git将项目传到GitHub上
查看>>
转摘-谈谈后端业务系统的微服务化改造
查看>>
搜索引擎优化
查看>>