【代码随想录】栈与队列

232. 用栈实现队列

  • push数据的时候,只要数据放进输入栈就好。
  • pop的时候,操作就复杂一些:输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。
    • Python List pop() Method
      • The pop() method removes the element at the specified position.
      • Note: The pop() method returns removed value.
  • 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. 有效的括号

由于栈结构的特殊性,非常适合做对称匹配类的题目。
遍历字符串,遇到左括号就在栈里加入相应右括号,这样避免了类型比较。

  1. C++里面要想把字母赋值给int,默认是以ASCII码形式存储。
  2. 剪枝条件:字符串长度一定是偶数——模2=0,即**%2=0**。
  3. 处理4种情况:
  • 遇到左括号,将对应右括号放入栈
    • 三种括号:“[”, “{”, “(”
  • 如果栈为空,表示字符串中右括号多了——return false; 保险起见要先判空
  • 遇到右括号,不需要将判断是否为某右括号写出来,只需判断栈顶元素是否和当前遍历的s[i]相匹配——不匹配return false
  • 栈顶和遍历到的元素s[i]相匹配时,栈顶元素弹出
  • 最后,加入字符串遍历完了栈并不为空
  1. python不需要for i in range(len(s))然后取s[i],可以直接for i in s遍历字符串。也不需要if len(stack) == 0, 可以直接not stack

1047. 删除字符串中的所有相邻重复项

  1. 栈用来存储遍历过的元素
  2. C++可以用字符串来模拟这个栈,只是把栈出口当作尾部,栈底当作头部
  3. 代码描述:如果栈为空或遍历元素与栈顶元素不相等——当前元素进栈;否则元素出栈
  4. 方法二,使用双指针模拟栈,如果不让用栈可以作为备选方法。二刷的时候再刷。

150. 逆波兰表达式求值

  1. 逆波兰式就是后缀表达式。
  2. 中序表达式在做计算’(1+2)✖️(3+4)'时,顺序处理需要加括号才能正确计算,但后序表达式’12+34+✖️’不需要加括号就可以正确计算。因此后缀表达式更方便计算机顺序处理计算。计算机处理后缀表达式的方法就是用栈
  3. 计算机利用栈处理后缀表达式的过程:遇到数字就进栈,遇到操作符就做计算,再把结果加入栈里。
  4. 代码过程:
  • python有自己的运算符库
  1. 第二遍刷用代码随想录网站上面更为简洁的代码。

239. 滑动窗口最大值

(一刷至少需要理解思路)

  1. C++里面的优先级队列就是大顶堆或小顶堆。大顶堆其实就是一个排序的二叉树。
  2. 滑动窗口移动的过程很像一个队列。本题其实要实现维护一个单调队列:pop前面的元素,push后面的元素,然后取max。——和优先级队列是不同的。
  • 保持队列出口的元素是队列中最大的。如果push进来的元素比出口处大,则要把该元素前面的都弹出,从而保持出口处是最大的。
  1. C++里面队列的底层实现默认是用deque。
  2. 队列的front和back都可以pop和push。

347.前 K 个高频元素

(一刷至少需要理解思路)

  1. 不需要给所有元素都按频率排序,只需要维护前k个元素即可——用小顶堆可以实现。
  2. 为什么小顶堆而不是大顶堆:大顶堆每次移除的是顶部最大的元素,不符合本题要求。
  3. 堆每次调整的时间复杂度——堆维护k个元素的时间复杂度:logk。整体遍历所有n个元素的时间复杂度:nlogk, 远大于将n个元素进行排序(假设是最快的快速排序)的nlogn.
  4. 不同语言实现堆的方式:
  • C++: 优先级队列priority queue
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值