美文网首页领扣(leetcode)
150. 逆波兰表达式求值

150. 逆波兰表达式求值

作者: 莫小鹏 | 来源:发表于2018-10-04 17:31 被阅读0次

    题目描述

    根据逆波兰表示法,求表达式的值。

    有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

    说明:

    整数除法只保留整数部分。
    给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
    示例 1:

    输入: ["2", "1", "+", "3", "*"]
    输出: 9
    解释: ((2 + 1) * 3) = 9
    

    示例 2:

    输入: ["4", "13", "5", "/", "+"]
    输出: 6
    解释: (4 + (13 / 5)) = 6
    

    示例 3:

    输入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
    输出: 22
    解释: 
      ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
    = ((10 * (6 / (12 * -11))) + 17) + 5
    = ((10 * (6 / -132)) + 17) + 5
    = ((10 * 0) + 17) + 5
    = (0 + 17) + 5
    = 17 + 5
    = 22
    

    分析

    通过栈来对逆波兰式求值,具体的方法:
    遇到操作数入栈,遇到运算符,把栈顶的操作数出栈,再把运算结果压栈
    a + b
    转成逆波兰式:
    a b +

    遍历的字符串 说明
    s:{a} a 入栈
    s:{b,a} b 入栈
    s:{sum} + 出栈,a+b=sum,再入栈

    注意点:

    • 防止数据溢出,使用long类型
    • string转long,使用atol函数

    代码

    class Solution {
    public:
        int evalRPN(vector<string>& tokens) {
            stack<long> s;
            for(auto&it:tokens) {
                if(it == "+" || it == "-" || it == "*" || it == "/") {
                    if(s.size() < 2) {
                        return 0;
                    }
                    auto b = s.top();
                    s.pop();
                    auto a = s.top();
                    s.pop();
                    if(it == "+") {
                        s.push(a + b);
                    } else if(it == "-") {
                        s.push(a - b);
                    } else if(it == "*") {
                        s.push(a * b);
                    } else {
                        s.push(a / b);
                    }
                    
                } else {
                    s.push(atol(it.c_str()));
                }
            }
            if(s.empty()) {
                return 0;
            }
            return s.top();
        }
    };
    

    题目链接

    https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/description/

    相关文章

      网友评论

        本文标题:150. 逆波兰表达式求值

        本文链接:https://www.haomeiwen.com/subject/ynwxaftx.html