150. 逆波兰表达式求值

时间:2024-03-08 19:47:02

题目来源:力扣

题目描述:

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

代码:

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        map<string,function<int(int,int)>> cmdFuncMap = {
            {"+",[](int x,int y){return x+y;}}
             //lambda语句
            //会转换为pair,调用initializer_list进行初始化
            ,{"-",[](int x,int y){return x-y;}}
            ,{"*",[](int x,int y){return x*y;}}
            ,{"/",[](int x,int y){return x/y;}}
        };
        //map的key是一个操作符,val是可调用对象(此处是lambda)
        
        stack<int> st;
        for( auto& str : tokens){ 
            
            if(cmdFuncMap.count(str))
            {
                //操作符
                int right = st.top();
                st.pop();
                int left = st.top();
                st.pop();

                st.push(cmdFuncMap[str](left,right));
                 //调用operator[]
            }else{
                //操作数
                st.push(stoi(str));
            }
        }
        return st.top();
    }
};

思路与总结:此次与以往不同,使用了包装器(包装器为C++11内容)

了解该题的本质,是命令与动作,即给一个指令后做出相应的动作,知道了深层含义,所以我们使用包装器来完成

进入if后就是命令对应一个函数,命令与函数是对应关系

这里调用operator[ ] ,返回对应的可调用对象(我们包装的是lambda),调用完成后会将运算结果入栈

这里可以体验C++的灵活性,在实际中,如果没有包装器等,场景中使用的就是宏+函数指针了

这段代码厉害的地方在于如果我们还要增加操作符,比如与和或,下面的都不用变,在这里添加即可

非常强大