单调栈,顾名思义,就是由一组数据。生成一个栈内数值单调递增或递减的栈。
单调栈的意义在于:
在生成单调栈的过程中,可以记录当前数组内的 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 }