# 224. 基本计算器
# 解题思路
- 将字符串拆分成数字和运算符组成的数组
- 遍历数组,消除括号
- 遇到左括号则创建一个新的数组,并将当前数组入栈
- 遇到数字和运算符则将其添加到栈顶数组中
- 遇到右括号则计算出栈顶数组内所有数字的运算结果,然后将处理后的数组出栈,同时将结果添加到新的栈顶数组中
- 遍历结束,栈内只有一个元素(此时已经去除了所有的括号),所以计算其结果即为最终结果
var calculateCore = function (strArr) {
let result = 0
let prevOp = '+'
for (let i = 0; i < strArr.length; i++) {
const item = strArr[i]
switch (item) {
case '+':
case '-':
prevOp = item
break
default:
result = handleCalculate(result, prevOp, item)
break
}
}
return result
function handleCalculate(val1, op, val2) {
switch (op) {
case '+':
return parseFloat(val1) + parseFloat(val2)
case '-':
return parseFloat(val1) - parseFloat(val2)
default:
throw new Error('unknown op.')
}
}
}
function splitStringByNonNumber(str) {
const regex = /(\d+)|[^\d\s]/g
const result = str.match(regex).filter(Boolean)
return result
}
var calculate = function (s) {
const strArr = splitStringByNonNumber(s)
if (strArr.length === 1) return parseFloat(strArr[0])
const pendingStack = [[]]
let currentLevel = 0
for (let i = 0; i < strArr.length; i++) {
const item = strArr[i]
switch (item) {
case '(':
pendingStack.push([])
currentLevel++
break
case ')':
currentLevel--
pendingStack[currentLevel].push(calculateCore(pendingStack.pop()))
break
default:
pendingStack[currentLevel].push(item)
break
}
}
return calculateCore(pendingStack[0])
}
在 LintCode 中提供了一种括号展开 + 栈的解题方式,详情可点击查看题解 (opens new window)。