「这是我参与11月更文挑战的第 21 天,活动详情查看:2021最后一次更文挑战」
题目
给你一个字符串表达式 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 整数
题解
提出问题
- 如何取除字符串
s中的空格? - 如何读取数字?
- 如何先乘除在加减?
分析
-
从题目中可以看处,字符串
s中有数字、运算符、空格,在计算的过程中可以利用stack -
可以通过
s = s.replace(/\s+/g,"")取除字符串s中所以空格 -
可以通过遍历字符串
s利用num = num * 10 + Number(s[i])得到数字 -
加法
stack.push(num) -
减法
stack.push(-num) -
乘法
stack.push(stack.pop() * num) -
除法
stack.push(stack.pop() / num | 0) -
假设
s = " 3+5 / 2 ",定义stack栈与` -
通过
s = s.replace(/\s+/g,"")取除字符串s中所有的空格 -
开始遍历
s,判断当前是否是数字如果是num = num * 10 + Number(s[i]) -
不是的话说明是运算符此时判断是哪一种运算符
-
如果是加法的话直接往
stack.push(num) -
如果是减法的话直接往
stack.push(-num) -
如果是乘法的话由于需要计算出结果
stack.push(stack.pop() * num) -
如果是除法的话由于需要计算出结果
stack.push(stack.pop() / num | 0) -
当执行完对应运算符结果时需要将
num重新赋值成0 -
重复执行上述操作
stack中的元素相加并返回结果
代码实现
/**
* @param {string} s
* @return {number}
*/
var calculate = function (s) {
s = s.replace(/\s+/g,"");
let stack = new Array()
let preSign = "+"
let num = 0
let n = s.length
for (let i = 0; i < n; i++) {
if (!isNaN(Number(s[i]))) {
num = num * 10 + Number(s[i])
}
if (isNaN(Number(s[i])) || i === n - 1) {
switch (preSign) {
case "+":
stack.push(num)
break
case "-":
stack.push(-num)
break
case "*":
stack.push(stack.pop() * num)
break
default:
stack.push(stack.pop() / num | 0)
break
}
preSign = s[i]
num = 0
}
}
let ans = 0
while (stack.length) {
ans += stack.pop()
}
return ans
};