JavaScript / TypeScript for LeetCode (六十)

本文介绍了如何使用JavaScript和TypeScript解决LeetCode上的第150题——逆波兰表达式求值。文章详细阐述了解题思路,并提供了两种语言的解决方案。在GitHub上可以找到完整的代码仓库。
摘要由CSDN通过智能技术生成

是差点运气,可我一直在努力!

当前进程:

  • 开始时间:2020.6.27
  • 结束时间:undefined

GitHub仓库:https://github.com/Cundefined/JavaScript-or-TypeScript-for-LeetCode

1、题目要求

( LeetCode-第150题 ) 逆波兰表达式求值

根据 逆波兰表示法,求表达式的值。

有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

说明:

  • 整数除法只保留整数部分。
  • 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

示例 :

输入: ["2", "1", "+", "3", "*"]
输出: 9
解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2、解题思路

解题思路:栈
1、定义判断tokens元素是否为操作符的函数,直接利用字符串方法
2、定义计算函数,传入左右操作数和操作符,根据操作符来选择计算方式
3、创建栈(用数组模拟)
4for循环遍历tokens数组:
    4.1、如果当前元素为运算符的话,则把栈顶的两个元素依次弹出作为左右操作数,计算后,把结果进栈
    4.2、否则,为数字的话,把当前字符串数字转成number类型后,进栈
5、循环结束后,栈中只剩下一个结果元素,直接出栈返回该结果

2.1、JavaScript Solution

/**
 * @param {string[]} tokens
 * @return {number}
 */
var evalRPN = function (tokens) {
  // 1、定义判断tokens元素是否为操作符的函数,直接利用字符串方法
  function isOperator(tokensElement) {
    return "+-*/".includes(tokensElement);
  }

  // 2、定义计算函数,传入左右操作数和操作符,根据操作符来选择计算方式
  function calculate(leftNum, rightNum, operator) {
    switch (operator) {
      case "+":
        return leftNum + rightNum;
      case "-":
        return leftNum - rightNum;
      case "*":
        return leftNum * rightNum;
      default:
        //   和0去按位或,可以实现直接去掉小数部分,而不是向上、向下取整
        return (leftNum / rightNum) | 0;
    }
  }

  // 3、创建栈(用数组模拟)
  let stack = [];

  // 4、for循环遍历tokens数组:
  for (let i = 0; i < tokens.length; i++) {
    // 4.1、如果当前元素为运算符的话,则把栈顶的两个元素依次弹出作为左右操作数,计算后,把结果进栈
    if (isOperator(tokens[i])) {
      let rightNum = stack.pop();
      let leftNum = stack.pop();

      stack.push(calculate(leftNum, rightNum, tokens[i]));
    } else {
      // 4.2、否则,为数字的话,把当前字符串数字转成number类型后,进栈
      stack.push(Number(tokens[i]));
    }
  }

  // 5、循环结束后,栈中只剩下一个结果元素,直接出栈返回该结果
  return stack.pop();
};

2.2、TypeScript Solution

function evalRPN(tokens: string[]): number {
  function isOperator(tokensElement: string): boolean {
    return "+-*/".includes(tokensElement);
  }

  function calculate(
    leftNum: number,
    rightNum: number,
    operator: string
  ): number {
    switch (operator) {
      case "+":
        return leftNum + rightNum;
      case "-":
        return leftNum - rightNum;
      case "*":
        return leftNum * rightNum;
      default:
        return (leftNum / rightNum) | 0;
    }
  }

  let stack: Array<number> = [];

  for (let i: number = 0; i < tokens.length; i++) {
    if (!isOperator(tokens[i])) {
      stack.push(Number(tokens[i]));

    } else {
      let rightNum: number = stack.pop();
      let leftNum: number = stack.pop();

      stack.push(calculate(leftNum, rightNum, tokens[i]));
    }
  }

  return stack.pop();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值