算法练习day10

48 阅读1分钟

一、有效的括号

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    if(s.length % 2 === 1) {
        return false
    }
    let stack = []
    for(let i = 0; i < s.length;i++) {
        switch(s[i]){
            case '(':
                stack.push(')')
                break
            case '{':
                stack.push('}')
                break
            case '[':
                stack.push(']')
                break
            default:
                if(s[i] !== stack.pop()) {
                    return false
                }
                
        }
    }
    return stack.length === 0
};

二、删除字符串中的所有相邻重复项

/**
 * @param {string} s
 * @return {string}
 */
var removeDuplicates = function(s) {
    let stack = []
    for(let i = 0; i < s.length; i++) {
        if(stack[stack.length -1] === s[i]) {
            stack.pop()
        } else {
            stack.push(s[i])
        }
    }
    return stack.join('')
};

三、逆波兰表达式求值

逆波兰表达式是一种后缀表达式,运算符写在后面

/**
 * @param {string[]} tokens
 * @return {number}
 */
var evalRPN = function (tokens) {
    let stack = []
    for (let i = 0; i < tokens.length; i++) {
        if (Number.isNaN(Number(tokens[i]))) {
            let val1 = stack.pop()
            let val2 = stack.pop()
            if (tokens[i] === '+') {
                stack.push(val1 + val2)
            } else if (tokens[i] === '-') {
                stack.push(val2 - val1)
            } else if (tokens[i] === '*') {
                stack.push(val2 * val1)
            } else if (tokens[i] === '/') {
                stack.push(val2 / val1 | 0)
            }
        } else {
            stack.push(Number(tokens[i]))
        }
    }
    return stack[0]
};