提交结果: 102 ms,84%
这题正常思路如下代码所示。需要注意的是负数。可以进一步,将三个函数合成一个,判断每次
测试安全:["3","-4","+"]
var evalRPN = function(tokens) {
var nums = [];
for(var i = 0, num1, num2; i<tokens.length; i++){
if(!isop(tokens[i])){
nums.push(tokens[i]);
}else{
num1 = nums.pop();
num2 = nums.pop();
nums.push( doop(num2,num1,tokens[i]) );
}
}
return parseInt(nums.pop());
};
function isop(a){
if(a == "+" ||a == "-" ||a == "*" ||a == "/" ){
return true;
}else{
return false;
}
}
function doop(num2,num1,token){
num2 = num2 - "0";
num1 = num1 - "0";
// console.log(num2,token,num1);
switch (token){
case "+":
return num2 + num1;
break;
case "-":
return num2 - num1;
break;
case "*":
return num2 * num1;
break;
case "/":
return parseInt(num2 / num1);
break;
}
}
方法二:实际效率比前一种方法竟然低。可能是乘除法占用时间比较长的缘故。
var evalRPN = function(tokens) {
if(tokens === null || tokens.length === 0){return null;}
var result = [];
for(var i = 0; i < tokens.length; i++){
if(tokens[i].charAt(0)==="-"&&tokens[i].length > 1){tokens[i] = " "+tokens[i];}
switch(tokens[i]){
default: result.push(parseInt(tokens[i])); break;
case "+": result.push(result.pop()+result.pop()); break;
case "*": result.push(result.pop()*result.pop()); break;
case "-": result.push(-1*result.pop() - (-1)*result.pop()); break;
case "/": result.push( parseInt(1/( result.pop()/result.pop() )) ); break;
}
}
return result.pop();
};