单调栈

简介: 复习acwing算法基础课的内容,本篇为讲解基础算法:用数组模拟单调栈,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。

文章目录

• 前言

• 一、单调栈

• 1.单调栈

• 2.AcWing 830. 单调栈

• 题目分析:

• AC代码

• 二、时间复杂度


前言

复习acwing算法基础课的内容,本篇为讲解基础算法:用数组模拟单调栈,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。


一、单调栈

1.单调栈

在单调栈中,元素都是按照从小到大排好序或者从大到小排好序的,关于用数组模拟栈见博客:用数组模拟栈,这里不做赘述,关于单调栈的应用和作用,我们由一道题目展开


2.AcWing 830. 单调栈

本题链接:AcWing 830. 单调栈

本博客给出本题截图:

image.png

题目分析:

本题使用的是用单调递增栈,当该元素可以入栈的时,栈顶元素就是它左侧第一个比它小的元素,即所求的值

接下来按照样例逐步分析:

3 4 2 7 5:

1.把3入栈,对应答案为-1

image.png

2.因为4 > 3,4入栈,输出3

image.png3.因为2 < 4,4 出栈

image.png

4.因为2 < 3,3出栈

image.png

5. 把2入栈,对应答案为-1

image.png

6.因为7 > 2,把7入栈,对应答案为2

image.png

7.因为5 < 7,把7出栈


image.png

8.因为5 > 2,把5入栈,输出2

image.png

故最后答案输出为-1 3 -1 2 2

AC代码

#include <cstdio>
using namespace std;
const int N = 100010;
int st[N], tt;
int main()
{
    int n;
    scanf("%d", &n);
    while (n -- )
    {
        int x;
        scanf("%d", &x);
        while (x <= st[tt] && tt) tt --;
        if (tt == 0) printf("-1 ");
        else printf("%d ", st[tt]);            //注意是先输出栈顶元素,再把x加入到栈中
        st[ ++ tt ] = x;
    }
    return 0;
}

二、时间复杂度

关于单调栈的各操作时间复杂度以及证明,后续会给出详细的说明以及证明过程,目前先鸽了。


目录
相关文章
|
18天前
|
消息中间件 存储 搜索推荐
深入理解栈和队列(二):队列
深入理解栈和队列(二):队列
33 0
|
1月前
【栈】数据结构栈的实现
【栈】数据结构栈的实现
|
1月前
|
存储
数据结构--栈和队列
数据结构--栈和队列
|
1月前
|
存储 算法 数据处理
数据结构从入门到精通——栈
栈,作为一种后进先出(LIFO)的数据结构,在计算机科学中扮演着重要的角色。它的特性使得它在处理函数调用、括号匹配、表达式求值等问题时具有得天独厚的优势。然而,如果我们跳出传统思维的束缚,会发现栈的用途远不止于此。
58 0
|
1月前
|
C语言
数据结构之栈详解(C语言手撕)
数据结构之栈详解(C语言手撕)
37 1
|
1月前
|
存储 算法
数据结构— —栈的基本操作(顺序栈和链栈)
数据结构— —栈的基本操作(顺序栈和链栈)
58 0
|
1天前
|
C语言
数据结构中顺序栈的进栈和出栈用C语言表示
数据结构中顺序栈的进栈和出栈用C语言表示
10 1
|
11天前
|
存储 算法 调度
数据结构期末复习(3)栈和队列
数据结构期末复习(3)栈和队列
18 0
|
23天前
|
存储 缓存 算法
【算法与数据结构】栈的实现详解
【算法与数据结构】栈的实现详解