单调栈

定义:顾名思义,单调栈,就是从栈顶到栈底元素递增或者递减的栈(看题目需求,特判相等的元素)。

实现:例如实现一个单调递增的栈,比如现在有一组数10,3,7,4,12, 2。从左到右依次入栈,\color{red}{如果要入栈的元素会破坏栈的单调性,则要让比入栈元素小的元素全部出栈,再将入栈元素入栈。}
10入栈时,栈为空,直接入栈。栈内元素为10
3入栈时,比栈顶元素10小,直接入栈。栈内元素为3,10
7入栈时,比栈顶元素3大,会破坏单调性,所以将栈顶元素出栈。此时7比栈顶10小,直接入栈,栈内元素为7,10;
4入栈时,比栈顶元素7小,直接入栈,栈内元素为4,7,10。
12入栈时,比栈顶元素4大,栈顶元素出栈,此时比栈顶元素7大,栈顶元素出栈,此时比栈顶元素10大,栈顶元素出栈,此时栈为空,直接入栈。栈内元素为12。
2入栈时,比栈顶元素12小,直接入栈。栈内元素为2,12。

应用:
\color{red}{1.最基础的应用就是给定一组数,针对每个数,寻找它和它右边第一个比它大的数之间有多少个数。}

对于应用2和应用3,最简单的思想,我们以序列中的每个元素为最小值,然后向左和向右扩展直到遇到比它还小的元素停止,然后记录这个子序列的长度,最后遍历寻找最大结果。如果直接暴力的话,时间复杂度很高,是不可取的,回想一下上述例子,正好可以用一个单调递减的栈来维护向左和向右扩展的操作。当每个元素入栈时,为了不破坏栈内单调性,栈内比它大的元素都要出栈,此时这些出栈的元素向右扩展的最大的位置就是。而当前入栈元素向左扩展的最小的位置就是。综上,在出栈时,更新栈内元素向右扩展的最大位置,在入栈时,更新入栈元素向左扩展的最小位置。。


应用一例题:
POJ3250
题解


应用二例题:
POJ2559
POJ3494
题解


应用三例题:
POJ2796
题解

你可能感兴趣的:(单调栈)