给你一个字符串表达式
s
,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在
[-231, 231 - 1]
的范围内。注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如
eval()
。示例 1:
输入:s = "3+2*2" 输出:7示例 2:
输入:s = " 3/2 " 输出:1示例 3:
输入:s = " 3+5 / 2 " 输出:5
// /**
// * @param {string} s
// * @return {number}
// */
// 写一个计算器功能的代码
// 这个题的重点在于:不应该是找到加号的时候做什么,而应该是找到乘号的时候,才知道我这个加号他加了个谁?
// 因为这个乘号的优先级要比比加号的优先级要大,
// 找到后一个运算符号的时候,才知道知道前面一个符号到底是做一个什么操作
// 这个就是运算符优先级的问题创建一个栈,假如拿一个算式:例子一:
// 当我们要判断 前面这个符号的时候,要找到下一个符号;所以用一个标识位pre 记录当前的符号,默认设为加号
// 然后将这个数字压入栈里面,比如压入3,接着判断运算符号,如果是一个加法,我们在算式前面放一个0,计算0+3;
// 接着把2压入栈里面,箭头往后移动,此时指向乘号,他的优先级大于加号,当我们遇到乘号,我们不去做加法,我们拿到栈顶元素
// 乘以 乘号后面的元素,乘完以后,再给他压入栈中;加入后面还有很多,一顿判断,最后遍历算式,把栈里面所有的元素拿出来
// 最后算一个总和。
var calculate = function (s) {
s = s.trim();
let stack = new Array();
let preSign = '+';
let num = 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;
default:
stack.push(stack.pop() / num | 0);
break;
}
preSign = s[i];
num = 0;
}
}
return stack.reduce((a, b) => a + b);
};
标签:break,leetcode227,压入,II,num,let,加号,计算器,stack
From: https://blog.csdn.net/Turboyiyi/article/details/143971555