单调栈????????
单调栈的性质如下:
-
元素具有单调性;
-
栈顶删除破坏单调性的元素;
-
使用单调栈可以找到元素向左遍历的第一个比他小的元素(单增栈),也可以找到元素向左遍历第一个比他大的元素(单减栈);
-
单调栈的题目具有特点:
-
离自己最近(栈的后进先出的性质)
-
比自己大(小)、高(低);
-
模拟单调栈:(递增)
有一个组数3,10,7,4,12。从左到右依次入栈,则如果栈为空或入栈元素值大于栈顶元素值,则入栈;否则,如果入栈则会破坏栈的单调性,则需要把比入栈元素大的元素全部出栈后,元素再入栈。
* 3入栈时,栈为空,直接入栈,栈内元素为3。
* 10入栈时,栈顶元素3比10小,入栈,栈内元素为 3,10。
* 7入栈时,栈顶元素10比7大,栈顶元素出栈,此时栈顶元素为 3,比7小。7入栈,栈内元素为 3,7。
* 4入栈时,栈顶元素7比4大,则栈顶元素出栈,此时栈顶元素为 3,比4小。4入栈,栈内元素为 3,4。
* 12入栈时,栈顶元素4比12小,12入栈,栈内元素为 3,4,12。
例题
划重点:y总yyds
//cpp
//作者:yxc
#include <iostream>
using namespace std;
const int N = 100010;
int stk[N], tt;
int main()
{
int n;
cin >> n;
while (n -- )
{
int x;
scanf("%d", &x);
while (tt && stk[tt] >= x) tt -- ;//栈顶元素大于当前元素,则出栈
if (!tt) printf("-1 ");//栈空,输出-1
else printf("%d ", stk[tt]);//非空,输出栈顶元素
stk[ ++ tt] = x;//当前元素入栈
}
return 0;
}