1.模板:
stack<int> st;
st.push(0);
for(int i = 1; i < nums.size(); i++){
while(!st.empty() && st.top() > nums[i]){
st.pop();
//计算、存放结果
}
st.push(nums[i]);
}
2.注意事项⭐:
(1)需要注意单调栈中stack存放元素为nums数组的下标还是nums数组中的元素。
例如:如果存放的是下标,比较时需要比较height[i]和height[left.top()],如果存放的是元素,则需比较height[i]和left.top()
(2)单调栈常常需要先 st.push(0),再从1开始遍历
(3)遍历栈中元素时需要pop掉栈顶元素时,要提前记录栈的大小,否则pop出去时,栈的大小改变,无法遍历完栈中元素
(4)单调栈需要搞清楚遇到相同大小元素时,后一个是否需要入栈(常常是需要)
错误示例×:
stack<int> st;
//由于上一轮循环中pop掉了栈顶元素,栈的大小也随之改变,无法遍历完栈中所有元素
for(int i=0;i<st.size();i++){
//对栈顶元素进行处理
//..
st.pop();
}
stack<int> st;
int len=st.size();
for(int i=0;i<len;i++){
//对st.top()做必要的处理
//..
st.pop();
}