栈【stack】& 栈的【STL】运用 & 【单调栈】 & 【单调栈】的详细解释【图文讲解】& 洛谷P5788 【模板】单调栈 & 【单调队列】

文章目录

栈的定义

栈的修改与访问是按照后进先出的原则进行的

栈通常被称为是后进先出(last in first out)表,简称 LIFO 表

是只允许在一端进行插入或删除操作的线性表

此动图来源于:oi-wiki

栈的STL运用

stack<T> st :建立一个名为st的T类型栈

st.top():返回栈顶

st.push():插入传入的参数到栈顶

st.pop():弹出栈顶

st.empty():返回是否为空

st.size():返回元素数量

单调栈 & 单调队列

单调栈的定义其实与单调队列的定义差不多,都需要保持单调性,单调栈即满足单调性的栈结构

有关单调队列可以看我的另一篇博文:
单调队列【deque】 & 队列【STL】& 洛谷P1886 滑动窗口 & 洛谷P9905 COCI 2023_2024 #1 AN2DL 【矩阵区间最大值】

单调栈的详细解释【图文讲解】

假设输入的数为:

复制代码
5
1 5 2 4 3

其中5是个数,剩下的1,5,2,4,3是输入的数列

假设:我们用这个数列以1~n的顺序维护一个单调递增的单调栈(PS:栈初始为空)

当i=1时,因为栈是空的,所以直接将1给压入栈

当i=2时,因为5 > 1 所以直接将5压入栈

当i=3时,因为2<5,所以将5弹出,因为2>1,所以直接将2压入栈

当i=4时,因为4>2,所以直接将4压入栈

当i=5时,因为3<4,所以将4弹出,因为3>2,所以直接将3压入栈

单调栈的伪代码:

cpp 复制代码
insert x//这是现在输入的数,insert的意思是输入
while (!sta.empty() && sta.top()<x)//如果这个栈不为空,并且栈顶比现在输入的数小则弹出这个数
    sta.pop()//弹出栈顶
sta.push(x)//将现在这个数给压入栈顶(现在这个数已经比栈顶小了)

总结而言,就是不断地弹出栈顶直到这(整个栈+现在输入的数)所组成的栈满足单调性为止

例题:洛谷P5788 【模板】单调栈

题意:这道题目就是模板题,只需要从后向前依次维护单调栈,最后反着输出答案即可

题目链接:P5788 【模板】单调栈

code↓
cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=3e6+5;//边界的值为maxn
long long n,a[maxn]={},ans[maxn]={};//a[]是输入数组,ans[]是答案数组,用来存储答案
stack<int> st;//这个栈里面存储的是编号
int f(int i){
	while(!st.empty()&&a[st.top()]<=a[i]) st.pop();//用于维护栈的单调性
	ans[i]=st.empty()?0:st.top();
	//这里运用了三元运算符,上方代码等同于↓
	//if(st.empty()==true) ans[i]=0;
	//else ans[i]=st.top(); 
	st.push(i);//将现在这个数的编号压入栈
	return 0;
}
int main(){
	cin>>n;//输入个数
	for(int i=1;i<=n;i++) cin>>a[i];//输入数组
	for(int i=n;i>=1;i--) f(i);
	for(int i=1;i<=n;i++) cout<<ans[i]<<" ";//因为最后存储的就是编号,所以直接输出即可
	return 0;
}
洛谷P5788 【模板】单调栈 AC
相关推荐
RaaS10012 分钟前
Agent Skills 进了 Linux Foundation:2.8 亿次安装,但装 skill 还没有安全规范
人工智能·算法·架构
CV爱数码27 分钟前
CT 重建从零开始(五):ASTRA Toolbox 上手——几何、投影器与算法
图像处理·算法·计算机视觉·ct
TunerT_TQ31 分钟前
超立方体Ramsey(openai/math 家族171)H11攻坚日志|D60–D69:Star分组重数、二幂坐标群、奇偶入射语义与Site‑Level候选计数形式化闭环
算法
fpcc32 分钟前
计算机原理—如何高效的操作文件
c++·计算机原理
Rabitebla1 小时前
【系统性学习笔记】Linux 权限篇(二):文件属性、权限修改与目录权限的底层逻辑
linux·c++·笔记·学习·算法
system_error_x1 小时前
C++ 编程基础入门教程
开发语言·c++
远离UE41 小时前
半拉格朗日学习笔记 动力学 实时渲染
人工智能·算法
小郎君6581 小时前
MPTT 不是万能编号:一棵百万节点树的增删改与批量事务
算法
FPGA小徐1 小时前
【一生一芯 / PA】AM 核心文件逐行解析(上):从 start.S 到 gpu.c
前端·算法
Tairitsu_H2 小时前
[动态规划#1] 子数组 | 最大子数组和 | 环形子数组的最大和 | 乘积最大子数组 | 乘积为正数的最长子数组
算法·动态规划