/*
	单调栈是一种特殊的栈结构,栈内元素保持单调递增或者单调递减的特性。在使用单调栈处理问题时,
	当有新元素入栈时,会根据单调性的要求对栈内元素进行调整,通常是将不符合单调性的元素出栈,
	直到满足单调条件后再将新元素入栈。
	单调栈主要用于解决一些与数组中元素的左右边界、最近较大值或最近较小值相关的问题,时间复杂度通常为 
	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;
}

  

posted on 2025-02-26 22:43  FYJUN2077  阅读(34)  评论(0)    收藏  举报