1,何为单调栈
顾名思义就是一个栈内元素满足单调性的栈,分为单调增栈与单调减栈。
2,怎样维护一个单调栈
(1)当新元素在单调性上优于栈顶时(单增栈新元素比栈顶大,单减栈新元素比栈顶小),压栈,栈深+1;
(2)当新元素在单调性与栈顶相同(新元素于栈顶相同)或劣于栈顶时(单增栈新元素比栈顶小,单减栈新元素比栈顶大),弹栈,栈深-1;
3,单调栈的实现
还是以单调增栈为例。
1 for(int i=1;i<=n;i++) 2 { 3 scanf("%d%d",&w,&h); 4 while(s[top]>=h) 5 { 6 if(s[top]>h&&top>0) top--; 7 else top--,ans--; 8 } 9 s[++top]=h; 10 }
注意,弹栈时要保证top>0,以防新元素为负数进入死循环。