• 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 )
  • 相关阅读:
    读取XML直接转换为类对象
    EF 连接sql2000
    Web自动化测试 七 ----- 鼠标、键盘操作
    Web自动化测试 六 ----- selector选择
    Web自动化测试 五 ----- selenium的等待和切换
    Web自动化测试 四 ----- python selenium 八大元素定位
    Web自动化测试 三 ----- DOM对象和元素查找
    Web自动化测试 二 ----- HTML
    Web自动化测试 一
    HTTP和HTTPS的区别
  • 原文地址:https://www.cnblogs.com/bubbleStar/p/6119922.html
Copyright © 2020-2023  润新知