[路飞]_程序员必刷力扣题: 227. 基本计算器 II

「这是我参与12月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

227. 基本计算器 II

力扣链接

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

示例1 :

输入: s = "3+2*2"
输出: 7
复制代码

示例2 :

输入: s = " 3/2 "
输出: 1
复制代码

示例3 :

输入: s = " 3+5 / 2 "
输出: 5
复制代码

提示:

  • 1 <= s.length <= 3 * 105
  • s 由整数和算符 ('+', '-', '*', '/') 组成,中间由一些空格隔开
  • s 表示一个 有效表达式
  • 表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
  • 题目数据保证答案是一个 32-bit 整数

思路

这个题目我们使用栈的思想来逐步处理表达式

这里我们需要用一个

变量ope来保存操作符(+ - * /),再用一个 num来保存当前扫描字符串得到的数字,如果连续是数字则将当前字符串item与num相加。

如果我们得到的是

  • ope='+' 和一个num ,直接将num放入栈中

  • ope='-' 和一个num ,直接将-num放入栈中

如果是两值相加,我们直接将数字放入栈中,如果是减法,那么就当做是-num,将num的负数放入栈中

如果我们得到的是

  • ope=' * ' 和一个num ,那么需要将栈顶元素弹出进行运算,再将结果push进去

  • ope=' / ' 和一个num ,那么需要将栈顶元素弹出进行运算,再将结果push进去(这里要进行取整)

因为乘除法优先级高于加减法,所以当遇到乘除法的时候,我们要从栈顶取出乘除符号左侧的数值,与当前右侧的数值进行运算后,运算后的结果放入栈中。

  • '1-2+3' 当遍历到表达式末尾3时,就需要对ope='+' num='3' 进行运算,所以增加条件i===s.length-1

我们每次进行push或者运算操作都是在遇到下一个运算符时再对上一个运算符与num操作,但是表达式末尾没有运算符只有数字,所以当遍历到最后一位时就开始进行运算

另外要注意整数除法仅保留整数部分,所以这里我们使用|的位运算符来保留整数部分。

最后将栈中的所有元素进行遍历后相加,就得到了我们的结果

var calculate = function (s{
    //去掉两边以及中间的空格
    s = s.trim()
    s = s.replaceAll(' ''')
    var stack = []
    var num = ''
    var ope = '+'
    for (var i = 0; i < s.length; i++) {
        var item = s[i]
        if (!isNaN(Number(item))) {
            num += item
        }
        if (isNaN(Number(item)) || i === s.length - 1) {
            switch (ope) {
                case '+':
                    stack.push(+num)
                    break
                case '-':
                    stack.push(-num)
                    break
                case '*':
                    stack.push(stack.pop() * num)
                    break
                case '/':
                    stack.push(stack.pop() / num | 0)
            }
            ope = item
            num = ''
        }
    }
    var res = 0
    while (stack.length) {
        res += stack.pop()
    }   
    return res
};
复制代码

猜你喜欢

转载自juejin.im/post/7033825333425995807