题解227: 基本计算器 II
给你一个字符串表达式
s,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。
示例:
@param {string} s
@return {number}
输入:s = "3+2*2"
输出:7
思路解读:
- 题中指定的输入类型为
String类型,而输出类型为number类型 - 基于题意,①需要进行字符串拆分查找确定运算符;②判断运算的优先级,进行相应运算
- 细节化处理,①将数字类型字符转换成数字(注意多位数字的操作);②非数字字符将其存入栈中,符号跟随(当为减运算时,将
num以-num的形式存入栈中 - 应用到的方法:数组类栈操作(
push,pop)、trim()、reduce()
var calculate = function (s) {
s = s.trim(); //从一个字符串的两端删除空白字符,去除空格操作
let stack = new Array(); //实例化一个数组对象,作为栈来存取接下来获得的数据
let preSign = '+'; //定义一个参数用于存储拆分后获得的运算符
let num = 0; //值保存,包括计算后的和拆分后的
for (let i = 0; i < s.length; i++) { //循环遍历,遍历的过程中进行数和符号的辨识
if (!isNaN(s[i]) && s[i] !== ' ') {//s[i]是一个数字且不为空时,(Not-a-Number)
// 处理多位数
num = num * 10 + Number(s[i]); //将其转换成数字
}
if (isNaN(s[i]) || i == s.length - 1) { //isNaN 确定值 是否为非数字
switch (preSign) { //判断符号匹配,在这里只需要着重思考乘和除的运算
//全部转换为加运算
case '+': //preSign预定义为+,所以第一个数字肯定push进去
stack.push(num);
break;
case '-':
stack.push(-num);
break;
case '*':
stack.push(stack.pop() * num);//将前一个push进去的num吐出来和当前的num进行乘运算后再push进去
break;
default:
stack.push((stack.pop() / num) | 0);//除法运算同上,直接进行除运算,|0进行位运算取整操作
break;
}
preSign = s[i]; //改变当前的preSign
num = 0; //重置num
}
}
return stack.reduce((a, b) => a + b); //reduce函数(最后将每个元素执行相加函数运算)reduce进行函数累加器
};
知识点回顾:
字符串操作方法和属性==》
-
trim()方法
-
reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
reduce() 可以作为一个高阶函数,用于函数的 compose。
注意: reduce() 对于空数组是不会执行回调函数的。
变量的定义是根据函数逻辑实现的过程中有所需时进行创建的,不需要进行提前思量
👆 👆 以上就是个人对【基本运算器Ⅱ】的代码解法和方法解读。
迷惑重重,一看上头,一键三连哟!!!
完成代码请移步: 稍后添加