150. 逆波兰表达式求值 JavaScript实现

150. 逆波兰表达式求值

题目链接
思想:判断是操作数还是运算符,可以自己写函数判断。

const isNumber = function(num){
    return !(num == '+' || num == '-' || num == '*' || num == '/')
}
  • 如果遇到操作数,则将操作数入栈;
  • 如果遇到运算符,则将两个操作数出栈,其中先出栈的是右操作数,后出栈的是左操作数,使用运算符对两个操作数进行运算,将运算得到的新操作数入栈。(对于除法,需要注意当结果大于0,向下取整。当结果小于0,则向上取整。)
  • 整个逆波兰表达式遍历完毕之后,栈内只有一个元素,该元素即为逆波兰表达式的值。
var evalRPN = function(tokens) {
    // 维护一个栈
    let stack = []

    // 遍历数组
    for (let i of tokens){
        // 判断是否是数字,如果是,入栈
        if(isNumber(i)){
            // 此时i是string类型,要进行加法,需要转换成整数
            stack.push(parseInt(i))
        }else{
           // 是符号,就从栈中取出数字进行操作,先取的为右操作数,后取的为左操作数
           let num2 = stack.pop()
           let num1 = stack.pop()

           if(i == '+'){
               stack.push(num1 + num2)
           }else if(i == '-'){
               stack.push(num1 - num2)
           }else if(i == '*'){
               stack.push(num1 * num2)
           }else{
               stack.push(num1/num2 >0 ? Math.floor(num1/num2) : Math.ceil(num1/num2))
           }
        }
    }
    return stack.pop()
};

const isNumber = function(num){
    return !(num == '+' || num == '-' || num == '*' || num == '/')
}

你可能感兴趣的:(leetcode刷题,#,栈和队列,数据结构,算法)