代码随想录day11|栈与队列-20. 有效的括号、1047. 删除字符串中的所有相邻重复项、 150. 逆波兰表达式求值

58 阅读1分钟

20. 有效的括号

image.png

思路:遍历s,为左半边的时候入栈,右半边的时候出栈比较是否匹配,不匹配则return false,最后栈为空则return true

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (str) {
    if(str.length % 2 === 1) return false
    let arr = []
    const match = new Map([
        [ '(', ')'],
        ['[',']'],
        ['{','}']
    ])
    for(let i of str){
        if(match.has(i)){
            arr.push(i)
        }else{
            if(i !== match.get(arr.pop())){
                return false
            }
         }
    }
    return arr.length === 0
}

另外补充: 复习Map 的函数

Map初始化时可以接受数组作为参数,如上代码所示,或者初始化后通过m.set(key, value)

  • m.has(key)
  • m.get(key) 不能像对象一样通过obj[key] 的形式获取
  • m.size //属性

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

image.png

经典的栈的应用,用数组模拟栈

var removeDuplicates = function(s) {
    let stack = []
    for (let i of s){
        if(i === stack[stack.length -1]){
            stack.pop()
        }else{
            stack.push(i)
        }
    }
    return stack.join('')
};

150. 逆波兰表达式求值

image.png

image.png

思路: 开始看到很懵,往下看发现提示都把做法写上了,遇到数字则入栈,遇到运算符则取出栈顶两个数字进行计算

/**
 * @param {string[]} tokens
 * @return {number}
 */

 const CALC = {
     '+': (a,b)=>a+b,
     '-': (a,b)=>a-b,
     '*': (a,b)=>a*b,
     '/': (a,b)=>a/b|0
 }
var evalRPN = function(tokens) {
    let stack = []
    
    for(let i of tokens){
        if(i === '+' || i === '-' ||i === '*' ||i === '/'){
            const n1 = stack.pop()
            const n2 = stack.pop()
            stack.push(parseInt(CALC[i](n2,n1)))
        }else{
            // 数字
              stack.push(Number(i))
        }
    }
    return stack.pop()
};