232. 用栈实现队列
- push数据的时候,只要数据放进输入栈就好。
- 但pop的时候,操作就复杂一些:输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。
- Python List pop() Method
- The pop() method removes the element at the specified position.
- Note: The pop() method returns removed value.
- Python List pop() Method
- peek和pop类似,不要重复写一遍代码,考虑代码抽象。另外,peek和pop的区别在于peek不需要删除队列开头的元素,因此用栈模拟的时候,先调用了self.pop(),需要再append上去。
225. 用队列实现栈
- 用一个队列实现就可以。
- push:即普通地将元素添加进来
- pop: 转换思路,把队列头部的前len-1个元素pop出来,加到尾部。那么之前在尾部的元素就到了最前面,整个队列顺序颠倒。
先判空也是很有必要的。
if self.empty():
return None
python list删除的几种方法:
- del ListName[index]; del ListName[start:end]
- ListName.pop(index) 不写index的话默认删除最后一位
- ListName.remove(element)
- ListName.clear() 用来删除列表的所有元素,也即清空列表
- top: 注意:
- 先判空
- 引用pop函数,代码复用
- empty: return not self.queue. 一个巧妙的判空方法
20. 有效的括号
由于栈结构的特殊性,非常适合做对称匹配类的题目。
遍历字符串,遇到左括号就在栈里加入相应右括号,这样避免了类型比较。
- C++里面要想把字母赋值给int,默认是以ASCII码形式存储。
- 剪枝条件:字符串长度一定是偶数——模2=0,即**%2=0**。
- 处理4种情况:
- 遇到左括号,将对应右括号放入栈
- 三种括号:“[”, “{”, “(”
- 如果栈为空,表示字符串中右括号多了——return false; 保险起见要先判空
- 遇到右括号,不需要将判断是否为某右括号写出来,只需判断栈顶元素是否和当前遍历的s[i]相匹配——不匹配return false
- 栈顶和遍历到的元素s[i]相匹配时,栈顶元素弹出
- 最后,加入字符串遍历完了栈并不为空
- 用python不需要for i in range(len(s))然后取s[i],可以直接for i in s遍历字符串。也不需要if len(stack) == 0, 可以直接not stack。
1047. 删除字符串中的所有相邻重复项
- 栈用来存储遍历过的元素
- C++可以用字符串来模拟这个栈,只是把栈出口当作尾部,栈底当作头部
- 代码描述:如果栈为空或遍历元素与栈顶元素不相等——当前元素进栈;否则元素出栈
- 方法二,使用双指针模拟栈,如果不让用栈可以作为备选方法。二刷的时候再刷。
150. 逆波兰表达式求值
- 逆波兰式就是后缀表达式。
- 中序表达式在做计算’(1+2)✖️(3+4)'时,顺序处理需要加括号才能正确计算,但后序表达式’12+34+✖️’不需要加括号就可以正确计算。因此后缀表达式更方便计算机顺序处理计算。计算机处理后缀表达式的方法就是用栈。
- 计算机利用栈处理后缀表达式的过程:遇到数字就进栈,遇到操作符就做计算,再把结果加入栈里。
- 代码过程:
- python有自己的运算符库
- 第二遍刷用代码随想录网站上面更为简洁的代码。
239. 滑动窗口最大值
(一刷至少需要理解思路)
- C++里面的优先级队列就是大顶堆或小顶堆。大顶堆其实就是一个排序的二叉树。
- 滑动窗口移动的过程很像一个队列。本题其实要实现维护一个单调队列:pop前面的元素,push后面的元素,然后取max。——和优先级队列是不同的。
- 保持队列出口的元素是队列中最大的。如果push进来的元素比出口处大,则要把该元素前面的都弹出,从而保持出口处是最大的。
- C++里面队列的底层实现默认是用deque。
- 队列的front和back都可以pop和push。
347.前 K 个高频元素
(一刷至少需要理解思路)
- 不需要给所有元素都按频率排序,只需要维护前k个元素即可——用小顶堆可以实现。
- 为什么小顶堆而不是大顶堆:大顶堆每次移除的是顶部最大的元素,不符合本题要求。
- 堆每次调整的时间复杂度——堆维护k个元素的时间复杂度:logk。整体遍历所有n个元素的时间复杂度:nlogk, 远大于将n个元素进行排序(假设是最快的快速排序)的nlogn.
- 不同语言实现堆的方式:
- C++: 优先级队列priority queue