栈是一种 先进先出 的数据结构,所有涉及需要 先进先出 的思路解题时,都可以使用栈。
其次栈和递归也有些相似,递归也是先压栈,先进来的先出去,跟函数调用栈一样。

有效的括号

一道经典的用栈解决的问题。给定一个只包括 ( ) { } [ ] 的字符串s,判断字符串是否有效。
有效字符串需要满足:
左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。

  1. 示例 1
  2. 输入:s = "()"
  3. 输出:true
  4. 示例 2
  5. 输入:s = "()[]{}"
  6. 输出:true
  7. 示例 3
  8. 输入:s = "(]"
  9. 输出:false
  10. 示例 4
  11. 输入:s = "([)]"
  12. 输出:false
  13. 示例 5
  14. 输入:s = "{[()]}"
  15. 输出:true

这道题有一规律:

  • 右括号前面,必须是对应的左括号,才能抵消
  • 右括号前面,不是对应的左括号,那么该字符串一定不是有效括号

也就是左括号我们直接入栈即可,发现是右括号就要跟栈顶元素匹配(先进先出,后入栈的元素在栈顶, 这时栈顶的元素是最后一个入栈的左括号),不匹配就返回false

  1. // 左右括号的建立对应关系
  2. const mapping = {
  3. '(': ')',
  4. '{': '}',
  5. '[': ']'
  6. }
  7. function isValid (str) {
  8. const stack = []
  9. const arr = str.split('')
  10. for (let i = 0; i < arr.length; i++) {
  11. const cur = arr[i]
  12. if (mapping(cur)) { // 对象的属性的值存在,则属性一定存在。没必要用Object.kyes()判断
  13. // 左括号直接入栈
  14. stack.push(cur)
  15. } else if (Object.values(mapping).some(i => cur === i)) { // 也可以不判断
  16. // 右括号匹配栈顶元素
  17. if (mapping[stack[stack.length - 1]] === cur) {
  18. stack.pop() // 栈顶元素出栈
  19. } else {
  20. break // 直接跳过
  21. }
  22. }
  23. }
  24. return !stack.length
  25. }

最小栈

设计一个支持 pop push top 的操作,并能在常数时间呢检索到最小元素的栈

  • push(x) —— 将元素X推入栈中
  • pop() —- 删除栈顶元素
  • top() —- 获取栈顶元素
  • getMin() —- 检索栈中的最小元素 ```javascript 示例:

MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); —> 返回 -3. minStack.pop(); minStack.top(); —> 返回 0. minStack.getMin(); —> 返回 -2.

提示: pop、top 和 getMin 操作总是在 非空栈 上调用。 ```