新手学习栈算法的一天

74 阅读1分钟

栈是什么?

栈是一个后进先出的数据结构,js中并没有栈,但是可以用Array来模拟栈

/*新建一个栈*/
const stack = []
/*入栈*/
stack.push(1)
stack.push(2)
/*出栈*/
const item1 = stack.pop()
const item2 = stack.pop()

栈的常用操作

  1. Array.push
  2. Array.pop
  3. 栈顶(stack[ stack.length - 1])

什么场景需要栈

  1. 需要后进先出的场景
  2. 十进制转二进制
  3. 判断字符串括号是否有效

比如 leetcode算法中的第20题

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

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
};
示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true
示例 3:

输入:s = "(]"
输出:false
示例 4:

输入:s = "([)]"
输出:false
示例 5:

输入:s = "{[]}"
输出:true
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-parentheses

解题思路:

1.新建一个栈

const stack = []

2.扫描字符串(遍历)

for(let i = 0;i<s.length;i++){
}

3.遇到左边的括号('(','{','[' ) 就入栈

for(let i = 0;i<s.length;i++){
    const c = s[i]
    if(c ==='(' || c === '{' || c==='['){
        stack.push(c)
    }
}

4.遇到和栈顶括号类型匹配的右括号就出栈,类型不匹配就不合法,

for(let i = 0;i<s.length;i++){
    const c = s[i]
    if(c ==='(' || c === '{' || c==='['){
        stack.push(c)
    }else{
        const top = stack[stack.length - 1]
        if(
            (top === '(' && c === ')') ||
            (top === '{' && c === '}') ||
            (top === '[' && c === ']') 
        ){
          stack.pop()
        }else {
            return false
        }
    }
}
return stack.length === 0

5.最后栈空就合法

结语

目前的时间复杂度是O(n),当然我这并不是最优解(而是菜鸡解法- -!),不过学习都是从简单的学起,如果大家有更好的想法,可以评论一下,大家一起学习