代码随想录算法训练营第11天 【栈与队列】| 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值

87 阅读1分钟

20. 有效的括号

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    let map = new Map();
    map.set("{","}");
    map.set("[","]");
    map.set("(",")");

    let stack = [];

    for (const char of s) {
        // i 左括号, 将对应右括号入栈
        if (map.has(char)) {
            stack.push(map.get(char));
            // 右括号,与栈顶不匹配
        } else if (char !== stack.pop()) {
            return false;
        }
    }
    if (!stack.length) return true;
    return false;

};

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

这道题掌握了思路其实比括号匹配还要简单

/**
 * @param {string} s
 * @return {string}
 */
var removeDuplicates = function(s) {
    let stack = [];
    for (const char of s) {
        // 当前字符 === 栈顶元素
        if (stack.length && char === stack[stack.length - 1]) {
            stack.pop();
        } else {
            stack.push(char);
        }
    }
    stack = stack.join("");
    return stack;

};

150. 逆波兰表达式求值

/**
 * @param {string[]} tokens
 * @return {number}
 */
var evalRPN = function(tokens) {
    let stack = [];
    let operatorMap = new Map([
        ["+", (a, b) => a + b],
        ["-", (a, b) => a - b],
        ["*", (a, b) => a * b],
        ["/", (a, b) => Math.trunc(a / b)]
    ]);

    for (const char of tokens) {
        // 运算符 根据情况进行计算
        if (operatorMap.has(char)) {
            // 注意顺序
            let num2 = stack.pop();
            let num1 = stack.pop();
            // 非常高妙的处理
            let res = operatorMap.get(char)(num1, num2);
            stack.push(res);
        } else {
        // 数字 直接入栈 【注意!!】数据类型
            stack.push(Number(char));
        }
    }
    return stack.pop();
};