首页 > 代码库 > 150. Evaluate Reverse Polish Notation

150. Evaluate Reverse Polish Notation

题目

Evaluate the value of an arithmetic expression in Reverse Polish Notation.

Valid operators are +-*/. Each operand may be an integer or another expression.

Some examples:

["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6

解题思路:

用栈来做,如果是数字则push进去,如果遇到运算符则将栈顶的两个数字push出,运算完成后再push进栈。

我的JavaScript代码:

var evalRPN = function(tokens) {
    var arr = []; var num;
    for(let i = 0; i < tokens.length; i++){
        if( !isNaN(tokens[i]) ){
            arr.push(tokens[i]);
        }else{
            let a = arr.pop(),b = arr.pop();
            a = parseInt(a); b = parseInt(b);
            if( tokens[i] === ‘+‘ ){
                num = b+a;
            }else if( tokens[i] === ‘-‘ ){
                num = b-a;
            }else if( tokens[i] === ‘*‘ ){
                num = b*a;
            }else if( tokens[i] === ‘/‘ ){
                if( (a*b)<0 ) num = Math.ceil( b/a );
                else num = Math.floor( b/a );
            }
            arr.push( num );
        }
    }
    return parseInt( arr[0] );
};

 

参考了https://discuss.leetcode.com/topic/18179/accepted-clean-java-solution之后,使用swith-case,更加干净的代码:

/**
 * @param {string[]} tokens
 * @return {number}
 */
var evalRPN = function(tokens) {
    var stack = [];
    for (var i = 0; i < tokens.length; i++) {
    switch (tokens[i]) {
      case "+":
        stack.push(stack.pop() + stack.pop());
        break;
          
      case "-":
        stack.push(-stack.pop() + stack.pop());
        break;
          
      case "*":
        stack.push(stack.pop() * stack.pop());
        break;

      case "/":
        var n1 = stack.pop(), n2 = stack.pop();
        if( n1*n2 > 0) stack.push( Math.floor(n2 / n1) );
        else stack.push( Math.ceil( n2 / n1) );
        break;
          
      default:
        stack.push( parseInt(tokens[i]) );
    }
  }
  
  return stack.pop();
};

总结与注意:

1. 判断字符串为数字的方法:isNaN( str );

2. 除法与减法操作时,数字的先后位置需要注意;

3. JavaScript中,整除的操作需要分为两类:

  • 两个数同号,整除结果Math.floor( a/b )
  • 两个数异号,整除结果Math.ceil( a/b )

150. Evaluate Reverse Polish Notation