单调栈

单调栈是一种特殊的栈结构,栈内元素保持单调递增或者单调递减的特性。在使用单调栈处理问题时,
当有新元素入栈时,会根据单调性的要求对栈内元素进行调整,通常是将不符合单调性的元素出栈,
直到满足单调条件后再将新元素入栈。
单调栈主要用于解决一些与数组中元素的左右边界、最近较大值或最近较小值相关的问题,时间复杂度通常为
O(n),因为每个元素最多进栈和出栈一次。

单调栈的分类
1. 单调递增栈: 栈内元素从栈底到栈顶是单调递增的,即栈顶元素是栈内所有元素中的最大值。
当新元素入栈时,如果新元素小于栈顶元素,则将栈顶元素出栈,
直到新元素大于等于栈顶元素或者栈为空,然后将新元素入栈。

2. 单调递减栈: 栈内元素从栈底到栈顶是单调递减的,即栈顶元素是栈内所有元素中的最小值。
当新元素入栈时,如果新元素大于栈顶元素,则将栈顶元素出栈,
直到新元素小于等于栈顶元素或者栈为空,然后将新元素入栈。

 1 // 实例:求数组中每个元素右侧第一个比它大的元素
 2 
 3 #include <iostream>
 4 #include <vector>
 5 #include <stack>
 6 
 7 // 函数用于找出数组中每个元素右侧第一个比它大的元素
 8 std::vector<int> nextGreaterElement(const std::vector<int>& nums) {
 9     int n = nums.size();
10     std::vector<int> result(n, -1); // 初始化结果数组,默认值为 -1,表示没有找到更大的元素
11     std::stack<int> st; // 定义一个栈,用于存储数组元素的索引
12     
13     for (int i = 0; i < n; ++i) {
14         // 当栈不为空且当前元素大于栈顶元素时
15         while (!st.empty() && nums[i] > nums[st.top()]) {
16             int topIndex = st.top();
17             st.pop();
18             result[topIndex] = nums[i]; // 更新栈顶元素对应的结果为当前元素
19         }
20         st.push(i); // 将当前元素的索引入栈
21     }
22     
23     return result;
24 }
25 
26 int main() {
27     std::vector<int> nums = {4, 1, 2, 5};
28     std::vector<int> result = nextGreaterElement(nums);
29     
30     // 输出结果
31     for (int num : result) {
32         std::cout << num << " ";
33     }
34     std::cout << std::endl;
35     
36     return 0;
37 }
单调栈

 

posted @ 2025-02-28 21:46  SIPnnnnn  阅读(10)  评论(0)    收藏  举报