227. 基本计算器 II(JS实现)

1 题目

实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: "3+2
2"
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5

链接:https://leetcode-cn.com/problems/basic-calculator-ii

2 思路

这道题考察逆波兰算法,主要的思路就是先将中缀表达式转换为后缀表单式,然后再进行计算,在此过程中注意多位整数的情况

3代码

/**
 * @param {string} s
 * @return {number}
 */
var calculate = function(s) {
    let stack = [];
    let nums = [];
    const map = {
        '*': 1,
        '/': 1,
        '+': 0,
        '-': 0
    }

    let prev;
    for (let alpha of s) {
        if (alpha === ' ') continue;

        let transformNum = temp = parseInt(alpha);
        if (!isNaN(prev) && !isNaN(transformNum)) {  //处理多位整数
            let prevNum = nums.pop();
            transformNum = prevNum * 10 + transformNum;
        }
        prev = temp;

        if (isNaN(transformNum)) {
            while(stack.length > 0 && map[stack[stack.length - 1]] >= map[alpha]) {    //如果是当前符号小于栈顶符号优先级,则栈顶符号依次出栈
                nums.push(stack.pop());
            }
            stack.push(alpha);
        } else {     //如果是数字直接输出
            nums.push(transformNum);
        }
    }

    nums = nums.concat(stack.reverse());
    stack = [];

    for (let alpha of nums) {
        let transformNum = parseInt(alpha);

        if (isNaN(transformNum)) {
            let num2 = stack.pop();
            let num1 = stack.pop();

            if (alpha === '+') {
                stack.push(num1 + num2);
            } else if (alpha === '-') {
                stack.push(num1 - num2);
            } else if (alpha === '*') {
                stack.push(num1 * num2);
            } else {
                stack.push(parseInt(num1 / num2));
            }
        } else {
            stack.push(transformNum);
        }
    }

    return stack[0];
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值