定义
栈内元素单调按照递增(递减)顺序排列的栈。 主要用于找到每一个元素左边或右边,第一个比它大或小的数时,可使用单调栈算法。时间复杂度
由于每个元素最多各自进出栈一次,复杂度是O(n)功能
递增单调栈:
在一个队列中针对每一个元素从它右边找到第一个比它小的元素 在一个队列中针对每一个元素从它左边找到第一个比它小的元素递减单调栈:
在一个队列中针对每一个元素从它右边寻找第一个比它大的元素 在一个队列中针对每一个元素从它左边寻找第一个比它大的元素算法步骤
示例1 递增单调栈
下一个元素要入栈时,先弹出所有比它大的元素 取一组元素为 5,3 ,4 ,7,2,9; step1:5入栈; step2:想让3入栈,发现栈顶元素5大于3 弹出5,发现栈为空,3入栈。 step3:想让4入栈,发现栈顶元素3比4小,直接入栈 step4:7同理直接入栈 step5: 想让2入栈,2是最小的,弹出所有元素后入栈 step6:想让9入栈,9大于2,直接入栈 所以栈中最终的元素是2,9。 由于大于入栈元素的会先被弹出,所以栈中留下的,一定是入栈元素左边比它小的元素 弹出大于元素后,栈顶元素就是入栈元素的左边第一个比它小的元素 相对的,入栈元素是栈顶元素的右边第一个比它大的元素递增单调栈实例代码
#include<iostream>
#include<stack>
using namespace std;
int main()
{
int n;
cin>>n;
stack<int>st; //栈容器
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
while(!st.empty()&&st.top()>x)st.pop(); //弹出所有大于x的元素
cout<<(st.empty()?-1:st.top())<<endl; //输出栈顶元素
st.push(x); //x入栈
}
return 0;
}
标签:入栈,左边,元素,栈顶,算法,单调,第一个 From: https://www.cnblogs.com/jk-2048/p/18029994