单调栈????????

单调栈的性质如下:

  1. 元素具有单调性;

  2. 栈顶删除破坏单调性的元素;

  3. 使用单调栈可以找到元素向左遍历的第一个比他小的元素(单增栈),也可以找到元素向左遍历第一个比他大的元素(单减栈);

  4. 单调栈的题目具有特点:

    • 离自己最近(栈的后进先出的性质)

    • 比自己大(小)、高(低);

模拟单调栈:(递增)

有一个组数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;
}