介绍:

前言:
本题事经典的数据结构最小栈的题目,简单来说就是模拟一种"先进后出"的仓库,在任意时刻都能快速回答"当前的仓库里最终的集装箱有多重。"
#解题思路步骤:
1、明确问题核心与规则:
1.1、给定了一棵无向树,没个基点代表仓库,边代表它的路径,我们需要设计一个栈结构来模拟集装箱先进后出的出入库,并且能在任意快速获取栈里的最大值。
1.2、肥肠经典的栈动态最值查询题,这个大部分的难点都在于普通栈只能 O(1) 来访问栈顶的元素,无法直接获得全局的最大值。
1.3、如果没次查询都遍历了整个栈找的最大值,对于题目中给的数据会超时,所以小亦用优化方案来实现 O(1) 的查询效率。
2、问题分析及递推思路:
我们无法在不遍历的情况下直接!获取普通栈的最大值,但我们可以通过额外维护一个辅助栈,进行记录每一步入栈的当前最大值,实现出路栈操作的递推变更,这可以避免了重复计算。
3、动态数据结构的设计:
仅需两个核心栈变量就可以完成了所有的操作,不用需要那些什么复杂机构存储鬼东西:
3.1、普通数据栈,存储每个入展的重量,模拟出先进后出的出入库规则。
3.2、最大值辅助栈,每一步都同步记录当前的栈最大值,保证能够查询时可以直接获取栈为全局的最大值。
4、两次栈操作具体递推逻辑:
整个过程中将通过同步维护两栈,保证能够出入库查询操作都均在 O(1) 时间复杂度:
4.1、入栈操作:将重量 X 压入数据栈 st ;若最大值的栈为空或 ,则将 X 压入最大值栈;否则将 max_st.top() 再次压入最大值栈,确保能够两个栈元素个数从头到位都相等,且每一步的栈顶都是当前数据栈的最大值。
4.2、出栈操作:若数据栈不为空,则同时弹出 st 和 max_st 的栈顶元素,保持两个栈的同步;若该仓库为空则直接忽略该操作。
4.3、查询操作:若当前最大值栈为空,那直接输出 0 ;反之就会直接输出 max_st.top(),即为i当前仓库内的最大集装箱的重量。
4.4、筛选最终 result:我们按照日志顺序处理所有操作,遇到查询的操作时咱直接输出结果就可以啦。
##复杂度:
1、时间复杂度:
。
2、空间复杂度:
。
###代码:
cpp
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 200010;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
stack<int> st;
stack<int> max_st;
while (n--)
{
int op;
cin >> op;
if (op == 0)
{
int x;
cin >> x;
st.push(x);
if (max_st.empty() || x >= max_st.top())
max_st.push(x);
else
max_st.push(max_st.top());
}
else if (op == 1)
{
if (!st.empty())
{
st.pop();
max_st.pop();
}
}
else if (op == 2)
{
if (max_st.empty())
cout << "0\n";
else
cout << max_st.top() << "\n";
}
}
return 0;
}
--- 感谢观看---
制作:Code.小亦
代码提供:Code.小亦
题目思路部分提供:无
代码部分思路提供:无
知识共享:无
知识查找来源:无
初审:Code.小亦。
终审:Code.小亦。
本文章属于原创作品,禁止任何人进行转载,除合作之外!!