1、单调栈
单调栈是指一个栈内部的元素具有严格单调性的一种数据结构,分为单调递增栈和单调递减栈。
其具有以下两个性质:
1,满足栈底到栈顶的元素具有严格单调性。
2,满足栈的先进后出特性,越靠近栈顶的元素越后出栈。
元素进栈过程:
对于一个单调递增栈来说,若当前进栈的元素为a,如果a<栈顶元素,则直接将a进栈。
如果a≥栈顶元素,则不断将栈顶元素出栈,直到满足a<栈顶元素。
模拟一个数列构造一个单调递增栈
进栈元素分别为3,4,2,6,4,5,2,3。
图片所示过程即为进栈过程。
实现单调栈STL栈和手写栈均可。
2,单调队列。
单调队列与单调栈及其相似,把单调栈先进后出的性质改为先进先出既可。
元素进队列的过程对于单调递增队列。
对于一个元素a,如果a>队尾元素,那么直接将a扔进队列,如果a≥队尾元素,则将队尾元素出队列,直到满足 a>队尾元素即可。
实现用STL的双端队列即可(我好像一直都是手写的)
由于双端队列即可以在队头操作,也可以在队尾操作,那么这样的性质就弥补了单调栈只能在一边操作的不足。可以使得其左边也有一定的限制。
3,时间复杂度分析
对于每个元素,其有且仅有一次插入,最多出现一次删除,故其时间复杂度为O(n)。
/*递增栈:(从栈顶到栈底递增)
1.元素入栈之后,其下面元素一定是其左边第一个比它大的数;(可用来求每个元素左边更大的第一个元素)
2.若在元素插入之前,栈顶元素比插入元素小,那么栈顶元素一定是插入元素左边第一个比它小的数
3.若在元素插入之前,栈顶元素比插入元素小,那么待插入元素是所有需要出栈的元素右边第一个更大的数; (可用来求每个元素右边更大的第一个元素)
4.最后一定会留下最大的数(对较大的数更有利)
递减栈:(从栈顶到栈底递减)
1.元素入栈之后,其下面的元素一定是其左边第一个比它小的数;(可用来求每个元素左边更小的第一个元素)
2.若在元素插入之前,栈顶元素比插入元素更大,那么栈顶元素一定是待插入元素左边一个更大的数
3.若在元素插入之前,栈顶元素比插入元素更大,那么栈顶元素一定是所有需要出栈的元素右边更小的数;(可用来求每个元素右边更小的第一个元素)
4.最后一定会留下最小的数(对较小 的数更有利)
*/