面试Leetcode - Stack

Source

Stack 

Stack 就是一个 后进先出(LIFO, Last In First Out) 的数据结构。

你可以把它想象成一摞盘子:

        ↑  最先拿出来
      ┌───┐
      │ C │
      ├───┤
      │ B │
      ├───┤
      │ A │
      └───┘
        ↑
      最后放进去

如果依次:

push A
push B
push C

那么:

pop() → C
pop() → B
pop() → A

核心操作

stack.append(x)   # push
stack.pop()       # pop
stack[-1]         # 看栈顶,但不删除

实现

Python 里一般直接用 list 实现 stack:

stack = []

stack.append(1)
stack.append(2)
stack.append(3)

print(stack[-1])  # 3

x = stack.pop()
print(x)          # 3

所以你刷题的时候,看到:

stack = []

基本就可以理解成:

我现在准备维护一个“后进先出”的东西。

做题

字符串处理相关

最经典的左右括号 lc20

需要考虑三种条件

左边,右边,左边没有只有右边

单调栈 monotonic stack

单调栈是一种特殊的 Stack:我们在不断 push / pop 的过程中,始终让栈里的元素按照某种单调顺序排列。

也就是说,普通 Stack 只要求:后进先出

而 Monotonic Stack 额外要求:栈内元素保持单调递增/减

应用场景

Next Greater/Smaller Element e.g lc739

Previous Greater / Smaller

如果题目出现:

“对于每个元素,找它左边/右边第一个比它大/小的元素”

脑子里直接蹦出来:Monotonic Stack