题目描述
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
示例
示例1:
输入: s = "3+2*2"
输出: 7
示例2:
输入: s = " 3/2 "
输出: 1
示例3:
输入: s = " 3+5 / 2 "
输出: 5
提示:
1 <= s.length <= 3 * 10^5s由整数和算符('+', '-', '*', '/')组成,中间由一些空格隔开s表示一个 有效表达式- 表达式中的所有整数都是非负整数,且在范围
[0, 2^31 - 1]内 - 题目数据保证答案是一个 32-bit 整数
JavaScript实现
/**
* @param {string} s
* @return {number}
*/
// 处理不同计算符的级别
function level(opt){
switch (opt){
case '@': return -1;
case '+':
case '-': return 1;
case '*':
case '/': return 2;
}
return 0
}
// 计算
function calculation(num1, opt, num2) {
switch (opt){
case '*': return num1 * num2;
case '/': return parseInt(num1 / num2);
case '+': return num1 + num2;
case '-': return num1 - num2;
}
return 0
}
//3+2-4*2/5
var calculate = function(s) {
let nums = [], ops = [];
// 设置一个优先级最低的’@‘; 当执行到@时,前面所有计算符全都运算完成了
s += '@';
let n = 0; // n 字符转转数字
for(let i = 0; i < s.length; i++){
if(s[i] == ' ') continue; // 处理空字符
if(level(s[i]) == 0) { // 处理数字序列
n = n * 10 + (s[i] - 0)
continue;
}
nums.push(n);
n = 0;
// 比较计算符优先级,如果ops中的优先级高,就先计算,
// 否则将现有计算符继续push
while(ops.length && level(ops[ops.length-1]) >= level(s[i])) {
let num1 = nums[nums.length -2];
let num2 = nums[nums.length -1];
nums.pop();
nums.pop();
let res = calculation(num1, ops[ops.length-1], num2);
nums.push(res);
ops.pop()
}
ops.push(s[i])
}
// 计算符序列中是否为空,如果不为空要继续计算; 简化
// nums.push(n)
// while(ops.length) {
// let num1 = nums[nums.length -2];
// let num2 = nums[nums.length -1];
// nums.pop();
// nums.pop();
// let res = calculation(num1, ops[ops.length-1], num2);
// nums.push(res);
// ops.pop()
// }
return nums[0]
};