单调栈
1. 适用场景
一般用于解决: 右侧(左侧)第一个大于(小于)的项这种题目。
2. 代码模版
function firstMax(arr) {
  const stack = []
  const ans = new Array(arr.length).fill(-1)
  for (let i = 0; i < arr.length; i++) {
    while (stack.length && arr[i] > arr[stack[stack.length - 1]]) {
      const index = stack.pop()
      ans[index] = i - index
    }
    stack.push(i)
  }
  return ans
}
提示
操作栈最好还是使用 stack[stack.length - 1] 和 push,虽然使用 stack[0] 和 shift 在写代码的时候会方便一点,
但是 shift 理论上是会移动数组中所有的项,在极端情况下可能会超时