解题思路
解题思路很简单,我们知道加减乘除中,乘法与除法运算优先级要高于加减运算, 那么首先我们需要一个栈空间,对我们的字符串进行遍历,判断当前位置是数字还是运算符号,当遇到加减法时,直接存入栈空间,这里假设我们最后结果只做加法运算,那么遇到减法运算符的情况,将它转位负数存入栈中,遇到乘法或者除法时,将栈顶弹出,做完运算再将它存入栈中,此时我们就需要保存一下当前的运算符类型!直至遍历结束
var calculate = function(s) {
// 去除字符串中的空格
s = s.trim()
// 定义栈空间
let pask = new Array()
let n = s.length
let num = 0
// 假想从第一个值就做加法运算
let preSign = '+'
for (let i = 0; i < n; i++) {
// 不是运算符的情况
if (!isNaN(Number(s[i])) && s[i] !== ' ') {
// 使用编码解决没有运算的情况
num = num * 10 + s[i].charCodeAt() - '0'.charCodeAt();
}
if (isNaN(Number(s[i])) || i === n - 1) {
switch (preSign) {
case "+":
pask.push(num)
break;
case "-":
pask.push(-num)
break;
case '*':
pask.push(pask.pop() * num)
break;
default:
pask.push(pask.pop() / num | 0)
break;
}
preSign = s[i]
num = 0
}
}
// 每次将栈顶弹出进行相加
let ans = 0
while (pask.length) {
ans += Number(pask.pop())
}
return ans
}