力扣:20. 有效的括号150. 逆波兰表达式求值

本次分享主要是通过栈的思想解决问题

20. 有效的括号:

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

有效的括号的特点是成对出现的,如果单个肯定是无效的,或者错乱了如"[(])",都是无效的;为什么会想到用栈的思想去解决一个有效括号的问题呢?浏览器左右箭头,代表这后台和前进,这个也是用栈来存储url的,浏览器分别用了两个栈分别存储前进的url和后台的url;当然这个有效括号只需要一个栈,可以把左括号作为一个入栈标识,右括号作为出栈标识(并且出栈的括号能和该右括号匹配上的括号),当结束的时候栈是空的即是有效的括号;具体代码实现如下:

const isValid = function(s) {
  const stack = []; // 存储左括号的栈
  for(let i = 0;i<s.length;i++){
      if(s[i] === '(' || s[i] === '{'|| s[i] === '['){ 
          stack.push(s[i])
      } else if(s[i] === ')'){
          let x = stack.pop();
          if(x !== '('){ // 遇到的)和栈顶匹配不是(就是无效括号
              return false
          }
      } else if(s[i] === '}'){
          let x = stack.pop();
          if(x !== '{'){
              return false
          }
      } else {
          let x = stack.pop();
          if(x !== '['){
              return false
          }
      }
  }
  if(stack.length){ // 如果栈最后不是空的即有括号没有配对,即无效括号
      return false
  }
  return true;
};

150. 逆波兰表达式求值

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

了解完概念之后,百科上讲的很清楚:​​​​​​实现逆波兰式的算法,难度并不大,但为什么要将看似简单的中缀表达式转换为复杂的逆波兰式?原因就在于这个简单是相对人类的思维结构来说的,对计算机而言中序表达式是非常复杂的结构。相对的,逆波兰式在计算机看来却是比较简单易懂的结构。因为计算机普遍采用的内存结构是栈式结构,它执行先进后出的顺序。​​​​

通过这句话就能明白该题需要用栈的思想来解决问题;翻译之后就是遇到数字入栈,遇到操作符(+、-、*、/)出栈两个数并计算,将计算的结果再入栈,栈中最后一个值即是结果

具体代码实现如下:

var evalRPN = function(tokens) {
  let stack = [];
  for(let item of tokens){
      if(isNaN(Number(item))){
         let num1 = Number(stack.pop()) || 0; // 第一个出栈的是减数或者除数
         let num2 = Number(stack.pop()) || 0; // 第二个出栈的是被减数或者被除数
         let res = 0;
         switch(item){
             case '+': res = num1 + num2;
                  break;
              case '-': res = num2 - num1;// 第一个出栈的是减数,第二个出栈的是被减数
                  break;
              case '*': res = num1 * num2;
                  break;
              case '/': res = parseInt(num2 / num1); // 第一个出栈的是除数,第二个出栈的是被除数
                  break;
         }
         stack.push(res)
      } else {
          stack.push(item)
      }
  }
  return stack.pop()
};

好了今天的分享就到这里;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值