「这是我参与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
};
复制代码