数据结构条例-单调栈
名称:单调栈
用途:
给定一个数组,使用O(n)的时间复杂度确定每个元素的下一个最大值(或最小值)。
描述:
单调栈是一个栈,同时保证栈内元素的单调性。
单调栈有2种操作:
- 往栈内新增元素。当新元素加入栈内会破坏栈内的单调性时,不停地弹出元素直到新增元素不会破坏栈内的单调性。新增元素就是弹出元素的下一个最大值(或最小值,具体情况视题目而定)。
- Pop。与普通栈(stack)的pop无异。
实现:
通过STL的stack可以实现。
题目日志:
洛谷P5788代码实现:
#include <stdio.h>
#include <stack>
using namespace std;
const int N = 3e6+100;
stack<int> s;
int a[N], b[N];
int main()
{
int n; scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(int i = 1; i <= n; i++)
{
if(!s.empty())
while(a[i] > a[s.top()])
{
b[s.top()] = i;
s.pop();
if(s.empty()) break;
}
s.push(i);
}
for(int i = 1; i <= n; i++) printf("%d ", b[i]);
}