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

文章目录

栈的定义

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

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

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

此动图来源于:oi-wiki

栈的STL运用

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

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
相关推荐
光头闪亮亮4 分钟前
C++使用nlohmann/json库解析JSON数据应用示例
c++
Peace & Love4875 分钟前
C++初阶 -- 模拟实现list
开发语言·c++·笔记
超级大只老咪7 分钟前
蓝桥杯知识点大纲(JavaC组)
java·算法·蓝桥杯
!chen8 分钟前
Unity[法线贴图]原理与实践
算法
G_dou_19 分钟前
并发编程基础
算法·rust
碧海银沙音频科技研究院1 小时前
ES7243E ADC模拟音频转i2S到 BES I2S1 Master输出播放到SPK精准分析
人工智能·算法·音视频
百度智能云2 小时前
MySQL最怕的IN大列表,被百度智能云GaiaDB治好了!查询速度提升60倍!
算法
信奥卷王2 小时前
[GESP202506 五级] 奖品兑换
数据结构·算法
似水এ᭄往昔2 小时前
【C++】--list的使用和模拟实现
开发语言·c++
十五年专注C++开发2 小时前
qtmqtt: 一个开源且好用的mqtt开源客户端
c++·qt·mqtt·开源