题目链接 LeetCode: leetcode-cn.com/problems/ba… 题目简介 给你一个字符串表达式
s,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
示例
输入: s = "3+2*2"
输出: 7
输入: s = " 3/2 "
输出: 1
输入: s = " 3+5 / 2 "
输出: 5
实现思路 1、由于乘除法的优先级高于加减法,所以先进行乘除运算,并将运算后的整数放回原表达式的相应位置,然后进行一系列的加减法即可
2、实现中,可以考虑使用栈的数据结构。保存所有最后要进行加减运算的整数。对于是加减法的整数直接压入栈中,对于是乘除法的数字可以先和栈顶元素运算再压入栈中。 代码实现
/**
* @param {string} s
* @return {number}
*/
var calculate = function(s) {
s = s.trim(); // 去掉字符串两边的空格
const stack = [];
let preSign = '+'; // 记录符号,默认第一个数字前是个+,对数字没有任何影响
let num = 0; // 记录当前数字
const n = s.length;
for(let i=0;i<n;++i){
// 找出所有数字
if(!isNaN(Number(s[i])) && s[i] !== ' '){
num = num * 10 + s[i].charCodeAt() - '0'.charCodeAt();
}
// 找出所有符号
if(isNaN(Number(s[i])) || i === n-1){
switch(preSign){
case '+':
stack.push(num); // 如果是+直接向栈中添加
break;
case '-':
stack.push(-num); // 如果是-,向栈中添加-num,相加时相当于做减法
break;
case '*':
stack.push(stack.pop() * num); // 如果是*,向栈中添加当前数字和栈顶元素相乘的结果,因为乘除法优先级更高
break;
default:
stack.push(parseInt(stack.pop() / num)); // 是 / ,则向栈中添加栈顶元素 / 当前数字并只取整数的结果
break;
}
preSign = s[i]; // 替换preSign 的值
num = 0;
}
}
let ans = 0; // 记录计算后的结果
while(stack.length){
// 将所有栈顶元素相加
ans += stack.pop();
}
return ans;
}