【原创】单调栈解析+模板

单调栈,顾名思义,就是由一组数据。生成一个栈内数值单调递增或递减的栈。

单调栈的意义在于:

在生成单调栈的过程中,可以记录当前数组内的 i 位置往左数,第一个比 i 位置的数大或小的数(大即为递减,小即为递增)(从左端开始入栈的情况下,右端开始入栈即为往右数)

单调递减栈生成过程:

1、在数组中,提取一个数;

2、若栈为空,直接放入,并记录当前原数组位置无最小/最大值;

3、若栈不为空,则将栈顶元素与数组中提取的数值进行比较;

4、若栈顶元素比数组中提取的元素更大,则弹出栈顶元素,继续比较新的栈顶元素,直至栈顶元素小于数组中提取的元素(转跳第5步)或栈空(转跳第2步);

5、若栈顶元素比数组中提取的元素要小,则先记录当前栈顶元素为(参见单调栈意义),后将提取的元素压入栈中。

实现代码如下:

 1 #include <iostream>
 2 #include <stack>
 3 using namespace std;
 4 stack <int> stk;
 5 int main(){
 6     int n,list1[50],L[50];
 7     cin>>n;
 8     for(int i=0;i<n;i++) cin>>list1[i];
 9     for(int i=0;i<n;i++){
10         while(!stk.empty()&&list1[stk.top()]>=list1[i]){//当前栈为单调递减,改为<=为单调递增
11             stk.pop();
12         }
13         if(stk.empty()){
14             L[i]=-1;
15         }
16         else L[i]=stk.top();
17         stk.push(i);
18     }
19 }
原文地址:https://www.cnblogs.com/Never-Land/p/11291899.html