/*
单调栈是一种特殊的栈结构,栈内元素保持单调递增或者单调递减的特性。在使用单调栈处理问题时,
当有新元素入栈时,会根据单调性的要求对栈内元素进行调整,通常是将不符合单调性的元素出栈,
直到满足单调条件后再将新元素入栈。
单调栈主要用于解决一些与数组中元素的左右边界、最近较大值或最近较小值相关的问题,时间复杂度通常为
O(n),因为每个元素最多进栈和出栈一次。
单调栈的分类
1. 单调递增栈: 栈内元素从栈底到栈顶是单调递增的,即栈顶元素是栈内所有元素中的最大值。
当新元素入栈时,如果新元素小于栈顶元素,则将栈顶元素出栈,
直到新元素大于等于栈顶元素或者栈为空,然后将新元素入栈。
2. 单调递减栈: 栈内元素从栈底到栈顶是单调递减的,即栈顶元素是栈内所有元素中的最小值。
当新元素入栈时,如果新元素大于栈顶元素,则将栈顶元素出栈,
直到新元素小于等于栈顶元素或者栈为空,然后将新元素入栈。
*/
// 实例:求数组中每个元素右侧第一个比它大的元素
#include <iostream>
#include <vector>
#include <stack>
// 函数用于找出数组中每个元素右侧第一个比它大的元素
std::vector<int> nextGreaterElement(const std::vector<int>& nums) {
int n = nums.size();
std::vector<int> result(n, -1); // 初始化结果数组,默认值为 -1,表示没有找到更大的元素
std::stack<int> st; // 定义一个栈,用于存储数组元素的索引
for (int i = 0; i < n; ++i) {
// 当栈不为空且当前元素大于栈顶元素时
while (!st.empty() && nums[i] > nums[st.top()]) {
int topIndex = st.top();
st.pop();
result[topIndex] = nums[i]; // 更新栈顶元素对应的结果为当前元素
}
st.push(i); // 将当前元素的索引入栈
}
return result;
}
int main() {
std::vector<int> nums = {4, 1, 2, 5};
std::vector<int> result = nextGreaterElement(nums);
// 输出结果
for (int num : result) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}