LeetCode:地址
题目要求
给你一个字符串表达式 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 整数
思路
这道题跟计算器1的区别就是多了乘除 在遍历的时候匹配到乘除把数值栈的最后一位pop出来两数操作完再压回栈中 */优先计算 -相当于加上-num 所以把数值栈全部维护成一个加法栈 最后遍历一遍数值栈累加就行了
tip: 虽然题目给的要求是所有整数都是非负数,但是在操作的过程中有可能你的栈会有-num这样的数出现 所以在操作除法的时候Math.floor就适用不了 改为Matg.trunc 直接保留整数。
代码
/**
* @param {string} s
* @return {number}
*/
var calculate = function(s) {
// 符号位
let sign = '+'
// 数值栈
let arr = []
// 累加和
let ans = 0
for(let i=0;i<s.length;i++){
if(s[i] === ' '){
// 过滤空格字符
}else if(s[i] < '0'){
// +-*/的ascii码都小于数字
sign = s[i]
}else {
let str = ''
while(i<s.length && s[i]>='0'){// 加减乘除和空格的都ascii都小于数字
str+=s[i]
i++
}
i-- // 上面的循环多了一次++ 在这里减掉
str = Number(str) // 转Number
//---觉得有强迫症不喜欢这种非强类型的算法,上面的循环可以改成位运算
if(sign === '+')arr.push(str)
if(sign === '-')arr.push(str*-1)
if(sign === '*')arr.push(arr.pop() * str)
if(sign === '/')arr.push(Math.trunc(arr.pop() / str))
}
}
for(let i=0;i<arr.length;i++){
ans +=arr[i]
}
return ans
};