队列先进先出,栈先进后出。
232.用栈实现队列
思路:push的时候,栈可以直接放入;pop时,因为栈的出口和入口是同一个,此时需要弹出的数据在栈的最底部,所以需要把这个栈的数据全部放入另一个栈,称为出栈,前提是出栈为空,如果出栈有数据,就直接弹出。
pop和pep的前半部分代码类似,可以复用,但是弹出后要再放入。
225.用队列实现栈
思路:用一个队列模拟栈:入栈是相同的。出栈的时候,队列应该将最后一个元素弹出,此时需要将除了最后一个元素都弹出,然后再push进队列里,此时队列的最前面的元素就是需要弹出的元素。
20.有效的括号
思路:剪枝操作,如果s的长度为奇数,直接return false。写一个map对象,值是左括号,对应的值是与其对应的右括号。遍历s,如果遇到的是左括号,放入栈中,如果是右括号,判断栈顶元素在map对象中的值是否与当前右括号相等,如果相等就弹出,不相等就return false。遍历结束的时候,栈为空表示s是有效的括号。
1047.删除字符串中所有相邻的重复项
思路:定义一个栈,for...of循环s,当栈为空时,直接加入当前的x;不为空时,取出栈顶元素,并用一个变量保存下来,当栈顶元素与当前元素相等时,不再做操作,因为已经取出了;不相等时,先将栈顶元素入栈,在将当前元素入栈,最后返回栈,并调用join()方法。
150.逆波兰表达式求值
思路:定义一个栈,当遇到数字时,存入栈,当遇到非数字时,取出栈顶的两个元素,按照加减乘除进行运算,然后把结果存入栈中,注意减法和除法的前后顺序。最后用res变量保存栈的最后一个数字,然后将栈释放,以免占用内存,最后返回res。运算过程可以提取成一个函数。
239.滑动窗口最大值
思路:pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作; push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止;
347.前K个高频元素
思路:利用map记录每个元素出现的频率,利用数组来比较排序元素