栈与队列
用栈实现队列
- 思路: 就是模拟的过程,准备两个栈,进栈操作和进队列操作无异,出栈时,先将前一个栈的值移动到后一个栈中,然后出栈。
用队列实现栈
- 思路: 也是模拟的过程,在进入队列时,就要将顺序调整,调整的方法就是多准备一个队列进行调换。
有效的括号
给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
- 思路:栈容易解决这种对称匹配的问题,所以只需要确定哪种情况不匹配即可,分析有三种清况,左右数量不对称,左右不匹配。具体实现为:每遍历一个字符,
就将与之对应的字符入栈,然后匹配,匹配成功就弹出,不成功就返回错误。
删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一
- 思路:与上一题类似,也是匹配,读取后存入栈,然后再与下一个匹配,相同则出栈,不同继续操作。
逆波兰表达式
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
- 思路: 同样,与上一题类似,只是将匹配成功后的删除操作改为了做运算。
滑动窗口最大值
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
- 思路:建立一个单调队列,这个队列是单调递减的,每次弹出顶端的值就是窗口内最大值,那么这个队列如何建立,其实要考虑的问题就是
第一点,如何有序的保证窗口每移动一次,对应的值就弹出,这一点需要判断弹出的值与队列出口的值是否相同,相同就将其弹出,因为窗口要右移,
第二点就是添加数据,添加的数据大于队列最后一个数据,那么就移除这些数据,然后将该值添加进去。
前k个高频字符
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
- 思路: 记录频次就用到了map,因为要排序,所以使用优先级队列prioritydeque,该队列内部可以定义比较器,通过设置优先级
可以实现大顶堆和小顶堆,也就是大到小的排序和小到大的排序。然后依此将前k个元素取出。