题目来源:力扣
题目描述:
给你一个字符串数组 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++的灵活性,在实际中,如果没有包装器等,场景中使用的就是宏+函数指针了
这段代码厉害的地方在于如果我们还要增加操作符,比如与和或,下面的都不用变,在这里添加即可
非常强大