Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目分析
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。
注意: 不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
思路讲解
我们在进行运算时,由于乘除法的优先级大于加减法,所以我们每次进行运算的时候,要根 据下一个运算符进行判断。所以我们需要在最前面手动添加一个运算符来辅助我们进行运 算。
我们可以创建一个栈,对于加减号后的数字,将其直接压入栈中;对于乘除号后的数字,可 以直接与栈顶元素计算,并替换栈顶元素为计算后的结果。
示例
输入: s = "3+2*2"
输出: 7
输入: s = " 3/2 "
输出: 1
输入: s = " 3+5 / 2 "
输出: 5
代码
/*
* @lc app=leetcode.cn id=227 lang=javascript
*
* [227] 基本计算器 II
*/
// @lc code=start
/**
* @param {string} s
* @return {number}
*/
var calculate = function(s) {
s = s.trim() // 去除字符串两端空格
let stack = new Array() // 定义一个栈
let preSign = '+' // 默认一个前置位是“+”
let num = 0 // 默认最开始的数加0
for (let i = 0; i < s.length; i++) {
// 是数字并且不为空时
if (!isNaN(s[i]) && s[i] !== ' ') {
num = num * 10 + Number(s[i])
}
// 符号或者走到末尾时
if (isNaN(s[i]) || i == s.length - 1) {
switch (preSign) {
case '+':
stack.push(num)
break;
case '-':
stack.push(-num)
break;
case '*':
stack.push(stack.pop() * num)
break;
case '/':
stack.push(stack.pop() / num | 0)
break;
default:
break;
}
preSign = s[i]
num = 0
}
}
return stack.reduce((a, b) => a + b)
};