day11 有效的括号|删除字符串中的所有相邻重复项|逆波兰表达式求值

1.有效的括号 leetcode20

首先分析所有的不符合情况,这道题有可能就会遗漏场景

1.已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false

2.遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false

3.遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false

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

 var isValid = function (s) {
  // 如果不是成对出现的,直接就不符合
    if (s.length % 2 !== 0) {
        return false
    }
 // 设置一个map集合
    let map = new Map([
        ['(', ')'],
        ['{', '}'],
        ['[', ']']
    ]);
    let stack = [];
    for (let item of s) {
        if (map.get(item)) {
            // 将左括号push进栈中
            stack.push(item);
            // 下面不在处理左括号
            continue;
        }
         // 找右括号跟现在的遍历的元素是否匹配
        if (map.get(stack.pop()) !== item) {
            return false
        }
    }
   // 遍历完整个栈中是否还有元素,如果有,说明括号没被完全匹配
    return stack.length ? false : true
}
var isValid = function (s) {
  for (let item of s) {
    let stack = [];
    if (item === '(') {
      stack.push(')')
    } else if (item === '{') {
      stack.push('}')
    } else if (item === '[') {
      stack.push(']')
    } else {
    // 如果是右括号,但是不等于当前遍历的元素,不符合,或者当栈已经为空了,
    // 没有匹配的字符了,说明右括号没有找到对应的左括号时,也不符合
      if (stack.pop() !== item) {
        return false;
      }
    }
  }
  return stack.length === 0;
}

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

定义一个栈,如果栈中没有元素或者当前元素跟栈顶的元素不相等的时候,把元素放入站里面,相等的时候,把栈顶的元素弹出来,做一个消除的动作。

var removeDuplicates = function (s) {
  let stack = [];
  for (let item of s) {
    // 栈顶元素当前元素不相等
    if (stack.length === 0 || stack[stack.length - 1] !== item) {
      stack.push(item)
    } else {
    // 栈顶元素跟当前元素相等,则消除
      stack.pop()
    }
  }
  return stack.join('')
};

3.逆波兰表达式求值  LeetCode150

本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么这岂不就是一个相邻字符串消除的过程,和1047.删除字符串中的所有相邻重复项 (opens new window)中的对对碰游戏是不是就非常像了。

如果是数字就入栈,当碰见操作符的时候,将栈顶的两个元素拿出来,用操作符操作后的结果,在放入栈中,直到碰见下一个操作符,在执行改步骤

["4","13","5","/","+"]

栈中先放入4,13,5.遇见操作符,将15和3拿出来,进行除法操作。然后将除后的结果,放入栈中。遇见加号,则将除后的结果和之前的数字,进行相加,最后放入栈中。

var evalRPN = function (tokens) {
    let stack = [];
    for (let item of tokens) {
        let value = Number(item);
        if (isNaN(value)) {
            let num1 = stack.pop();
            let num2 = stack.pop();
            //将遇见操作符之后,栈顶的两个元素的结果放入栈中,继续进行计算
            if (item === '+') {
                stack.push(num2 + num1)
            } else if (item === '-') {
                stack.push(num2 - num1)
            } else if (item === '*') {
                stack.push(num2 * num1)
            } else {
           // 除法记得取整
                stack.push(Math.floor(num2 / num1))
            }
        } else {
            stack.push(value)
        }
    }
   // 取栈顶元素
    return stack[0]
};

总结:栈非常擅长做相邻元素的消除操作

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值