栈
使用栈
-
- 逆波兰表达式求值(遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中)
-
- 有效的括号
-
- 最长有效括号 (栈记录序号位置)
-
- 最小栈(新建一个栈存储最小值)
-
- 比较含退格的字符串(string就是一个栈)
栈和队列转换
-
- 队列实现栈(两个队列或一个队列实现,两个队列:每次两个队列互转的时候,保留最后一个元素弹出)
-
- 用栈实现队列 (只能用两个栈实现,第二个栈作为缓冲区)
单调栈
单调栈模板:
第一种题型:找到一个数的左右两边的第一个比该数大(波峰)(或者小波谷)的数
下面模板为递增栈:我们可以拿到一个数(波峰)的左右两边第一个小于等于他的值。递增找波峰
如果想拿一个数(波谷)的左右两边第一个比他大的值,则使用递减栈
//由于最后一位计算如果没有小于的数则栈不会弹出,所以在最前面和最后一位都补位,看具体情况补什么0或-1 等
stack<int> st;//一般这里记录index
//遍历数组
for(int i = 0; i < nums.size(); i++)
{
//如果当前元素前面存在比他大的元素则进入循环,则我们维护的是递增栈
while(!st.empty() && nums[i] < st.top())
{
//1. 波峰为:当前栈顶元素
int curNumber = st.top();
st.pop();
//2. 弹出后的栈顶元素为:左边比波峰小的第一个值
int leftValue = st.top();
//3. 当前遍历到的元素为:右边比波峰小的第一个值
int rightValue = nums[i];
}
//当前元素入栈
st.push(nums[i]);
}
-
- 柱状图中最大的矩形(波峰)
-
- 每日温度(波谷)
-
- 下一个更大元素 I
-
- 下一个更大元素 II(原数组扩大二倍)
第二种题型:栈中留下递增或递减序列,移除波峰或者波谷
利用单调栈性质:单调栈中存储的都是递增或者递减的排列。
-
- 移掉K位数字
-
- 去除重复字母