232.用栈实现队列
tip:栈模拟队列
//输入栈和输出栈
// push: 压入输入栈
// pop: 输出栈
// ==null,输入栈全部push输出栈,然后从输出栈pop
// !=null,直接从输出栈pop
// peek: 获取输出栈栈顶元素
// empty: 输出,输入栈,同时为空,true
使用的api:
Stack.class:pop() push() peek() isEmpty()
225. 用队列实现栈
tip:队列模拟栈
//输出(主)队列,拷贝(辅)队列
//push: 将新元素插入拷贝队列
// 输出队列!=null 将输出队列,全部入拷贝队列
// que1 que2身份互换(此时,que1的队首就是栈顶)
//pop: 主队列输出队首(que1的队首就是栈顶)
20. 有效的括号
tip:匹配问题,栈的运用
//分清三种无法匹配的情况 左边多余 中间不匹配 右边多余
//遍历字符串:
若是左括号,将其对应的右括号入栈
若是右括号,判断栈顶是否与之匹配,若匹配,出栈;不匹配,false
若是遍历未结束,栈已经空,则右边多余
若是遍历结束,栈空,true;反之亦然
1047. 删除字符串中的所有相邻重复项
tip:匹配问题,栈的运用。
//讨论清楚入栈出栈的情况
//遍历字符串,若栈顶和当前遍历到的字符,不匹配,入栈;反之,出栈
150. 逆波兰表达式求值
tip:匹配问题,栈的运用。
//讨论清楚入栈出栈的情况
//遍历字符数组,
//遇到数字,入栈
//遇到运算符,出栈两次,取出两数,进行运算,注意左右位置
239. 滑动窗口最大值
tip:滑动窗口,队列的运用。这里取巧,维护一个单调队列。
//维护一个单调递减队列,窗口变化(左右边界的变化),单调队列就更新
//左窗口移动,单调队列出队:
// 若队首元素不是窗口左边界的值,就不操作;否则,删除单调队列的队首
//右窗口移动,单调队列入队:
// 若插入的新值大于队尾元素,则删除队尾元素,直到队尾不再比新值小,新值入队列
347. 前 K 个高频元素
//关键词:任意顺序,恰好可以利用优先队列(堆)解决
//先用map统计各数频率
//使用优先队列,比较器,比较的是Entry的value即频率,o1.getValue()-o2.getValue(),升序,小顶堆
//遍历map.entrySet() Set集合,放入优先队列PriorityQueue,若未遍历到k次的位置,就出队,最后队列里剩的就是前k的高频率数