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

文章介绍了栈数据结构在解决括号匹配问题、删除字符串相邻重复项以及逆波兰表达式求值中的应用。通过遍历字符串,利用栈来处理字符,确保括号的正确配对,删除重复字符,以及进行数学运算。这三个示例展示了栈在处理序列和运算问题时的有效性。
摘要由CSDN通过智能技术生成

遇到匹配问题就可以想到用栈了!

20.有效的括号

括号匹配问题有三种不匹配的情况:

第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false;

第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false;

第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false。

字符串遍历完之后,栈是空的,就说明全都匹配了。

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (s) {
    let stack = [],
        map = {
            '(' : ')',
            '{' : '}',
            '[' : ']'
        };
    for (const x of s) {
        if(x in map) {
            stack.push(x);
            continue;
        }
        if(map[stack.pop()] !== x) return false;
    }
    return !stack.length;
};

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

遍历字符串的过程中,如果栈中的最后一个元素和当前字符相同,那就把栈的最后一个元素(length - 1)弹出来。

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

150. 逆波兰表达式求值

同样是遍历字符串,如果是数字就加入到栈中,如果是符号就pop出栈中最后加入的两个元素(注意顺序),做运算之后再把结果加到栈中,最后栈中就只剩下一个结果元素。

/**
 * @param {string[]} tokens
 * @return {number}
 */
var evalRPN = function(tokens) {
    let stack = [];
    for (const token of tokens) {
        if(isNaN(Number(token))) {
            const n2 = stack.pop();
            const n1 = stack.pop();
            switch(token) {
                case '+':
                    stack.push(n1 + n2);
                    break;
                case '-':
                    stack.push(n1 - n2);
                    break;
                case '*':
                    stack.push(n1 * n2);
                    break;
                case '/':
                    stack.push(n1 / n2 | 0);
                    break;
            } 
        }
        else {
            stack.push(Number(token));
        }
    }
    return stack[0];
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值