我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战
基本计算器 II
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
解题思路: 栈
- 将数字存到栈中。 如果碰到
+-运算符 :+直接放到栈里,-把数字的添加负号入栈, 如果碰到*/这两个运算符优先级比较高,需要将当前的数字与栈顶弹出的数字进行计算得到一个结果,再次放到栈中。 - 最后是将栈中的元素全部加起来就是计算器的结果啦。
/**
* @param {string} s
* @return {number}
*/
var calculate = function(s) {
// 首先得去掉两边的空格
s = s.trim();
var n = s.length;
var stack = []
let preSig = '+'; // 初始化符号变量
let num = 0
for(let i = 0; i< n; ++i){
let ch = s[i]
// 如果是数字判断排除空格的情况
if(!isNaN(Number(s[i])) && s[i] !== ' '){
// 计算数字如果是不只一位的情况 如:23
num = num * 10 + s[i].charCodeAt() - '0'.charCodeAt()
}
// 判断当字符是符号的情况, 最后是一位数字的情况i == n-1
if(isNaN(Number(s[i])) || i === n-1){
switch(preSig){
case '+':
// 加号数字直接入栈
stack.push(num)
break;
case '-':
// 减号添加负号入栈
stack.push(-num)
break;
case '*':
// 乘号这里要注意顺序 是将栈顶元素 和当前数字做运算
stack.push(stack.pop() * num )
break;
default:
// 除法同乘法
stack.push(stack.pop() / num | 0) // | 二进制运算符 取或 防止计算出现小数
}
preSig = s[i];
num = 0
}
}
let ans = 0
// 遍历栈中结果全部累加起来
while(stack.length){
ans += stack.pop()
}
return ans;
};
结束语
计算器乘除法是优先处理的,所以我们需要用到栈的思想,我们先要将数字放到栈中,在遇到
/*的时候将栈顶元素拿出来计算。最后计算加减。如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~