LeetCode刷题日记之栈与队列II

这篇博客介绍了三种使用栈解决的编程问题:1.检查字符串是否为有效的括号组合;2.删除字符串中的所有相邻重复项;3.解析逆波兰表达式并进行计算。通过辅助栈,分别实现了对括号匹配的判断,字符串去重,以及计算逆波兰表达式的过程。这些算法在处理字符串和表达式计算时具有广泛应用。
摘要由CSDN通过智能技术生成

1.有效的括号

题目描述

在这里插入图片描述

解题思路

1.定义一个辅助栈stack来存放字符串,再定义一个以符号最为键、值的对象obj
2.循环遍历字符串,判断栈顶元素对应的key在obj中的值是否等于当前遍历值s[i],如果等于则直接弹栈,不等于则将s[i]值推入栈中。
3.最后判断栈是否为空,为空则是有效的括号,反之则不是。

var isValid = function(s) {
    let obj = {
        '{':'}',
        '[':']',
        '(':')'
    }
    let stack = [];
    for(let i =0;i<s.length;i++){
        const top = stack[stack.length - 1]
        if(obj[top] == s[i]) {
            stack.pop()
        } else {
            stack.push(s[i])
        }
    }

    return stack.length == 0
};

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

题目描述

在这里插入图片描述

解题思路

1.该题思路与有效的括号类似,先定义一个辅助栈stack来存放遍历过的数据
2.当栈顶元素与当前遍历项相等时弹栈,如果不相等则入栈
3.最后将栈元素拼接成字符串即可。

var removeDuplicates = function(s) {
  const stack = []
  for(let i = 0;i<s.length;i++){
      if(stack[stack.length - 1] == s[i]){  // 判断栈顶元素与当前元素
          stack.pop()
      } else{
          stack.push(s[i])
      }
  }
  return stack.join('')
};

3.逆波兰表达式

题目描述

在这里插入图片描述

解题思路

1.逆波兰表达式大概可以理解为遇到运算符之后就将前两个数字拿出来计算结果,将结果作为一个数字继续参与下次计算。
2.由于两个数字之间的除法只取整数部分,需要注意的是正数和负数的取整有区别需要注意。
3.同样定义一个辅助栈stack来存放数字。
4.循环遍历tokens,遇到数字就直接入栈,遇到符号则直接连续弹出两个栈,再将计算结果入栈即可。
5.最后栈中剩下的最后一个数字就是计算结果,题不难,写的时候注意细节即可。

var evalRPN = function(tokens) {
  const stack = []
  for(let i = 0;i<tokens.length;i++) {
      if(!isNaN(tokens[i])){
          stack.push(tokens[i])
      } else {
          const num1 = Number(stack.pop()) // 由于是有效表达式 不用判断极端情况
          const num2 = Number(stack.pop())
          let res;
          if(tokens[i] == '+') {
              res = num1 + num2;
          } else if(tokens[i] == '-') {
              res = num2 - num1  // 减法和除法 num2放前面
          } else if(tokens[i] == '*'){
             res = num2 * num1
          } else {
              res = num2 / num1
              res = res > 0 ? Math.floor(res) : Math.ceil(res) // 正负数取整有区别
          }
          stack.push(res)
      }
  }
  return stack.pop()
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值