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

20.有效的括号

题目链接:https://leetcode.cn/problems/valid-parentheses/

var isValid = function(s) {
const stack=[]
for(let i=0;i<s.length;i++){
    let c=s[i]
    switch(c){
        case'(':
        stack.push(')');
        break;
        case'{':
        stack.push('}')
        break;
        case'[':
        stack.push(']')
        break;
        //输出默认结果
        default:
        if(c!==stack.pop()){
            return false
        }
    }
}
return stack.length===0
};

看完视频所学:

1.解决本题的关键是利用栈,遍历所给的字符串s,遍历到哪一个就将所对应的相反的样子放入栈中,匹配时弹出和所遍历的对比即可。和栈口的相比较消除即可。

2.回顾一下switch
在这里插入图片描述
在这里插入图片描述

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

题目链接:https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/

var removeDuplicates = function(s) {
// 将s变为数组
s=[...s]
let top =-1 //栈顶元素的下标 默认为-1代表空栈
for(let i=0;i<s.length;i++){
    if(top===-1||s[top]!==s[i]){
        s[++top]=s[i] //入栈操作
    }else{
        top-- //出栈
    }
}
s.length=top+1
return s.join('')
}

看完视频所学:

1.本题的关键也在于将我们遍历过的元素放入栈中,注意的一点是遍历某个元素的时候如果栈口的元素和其相同,那么将其弹出清除即可。

2.一个小知识点:

栈中定义一个top变量用来表示栈顶元素的下标位置,top默认为-1表示的是空栈,若入栈一个元素,则top++,当top+1等于数组的长度时,表示此栈已满。

150. 逆波兰表达式求值

题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/

var evalRPN = function(tokens) {
const stack=[]
for(let i=0;i<tokens.length;i++){
    if(isNaN(Number(tokens[i]))){//不是数字
    const a2=stack.pop()
    const a1=stack.pop()//出栈
    switch(tokens[i]){
        case '+':
        stack.push(a1+a2)
        break;
        case '-':
        stack.push(a1-a2)
        break;
        case '*':
        stack.push(a1*a2)
        break;
        case '/':
        stack.push(a1/a2|0)
        break
    }
    }
    else{
        // 是数字
        stack.push(Number(tokens[i]))
    }
}
return stack[0]
};

看完视频所学:

1.本题的关键在于首先要理解题意是什么意思,所给出的字符串数组这种表示方法为二叉树中的后序表示法,而需要转换为我们所熟悉的中序表示法,然后再计算出来结果。

2.依旧是利用栈,然后遇到数字就将其加入栈中,遇见操作符则从栈中去除两位元素做相关计算,再将结果放入栈中即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值