题目大意为:给你一个计算式的逆波兰式表示形式的字符串数组(vector数据结构),计算出该计算式的值
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6这种问题的最通用解法就是利用栈,遇到数字就压栈,遇到运算符从栈顶退两数字,计算出结果再压栈。结束时栈中只剩一个数字,就是结果
如果出现运算符没有两个数字提供输入或者最后剩下多个数字时,可认为输入非法。
AC代码如下
class Solution {
public:
vector<int> paras;
int evalRPN(vector<string> &tokens) {
paras.clear();
vector<string>::iterator token = tokens.begin();
while(token!=tokens.end())
{
if((*token).length()>1 || ((*token)[0]!='+' && (*token)[0]!='-' && (*token)[0]!='*' && (*token)[0]!='/'))
{
int tmp=atoi((*token).c_str());
paras.push_back(tmp);
}else
{
int b=*--paras.end();
paras.pop_back();
int a=*--paras.end();
paras.pop_back();
int buf;
switch ((*token)[0])
{
case '+':buf=a+b;paras.push_back(buf);break;
case '-':buf=a-b;paras.push_back(buf);break;
case '*':buf=a*b;paras.push_back(buf);break;
case '/':buf=(int)(a/b);paras.push_back(buf);break;
default :;
};
};
token++;
};
return *paras.begin();
}
};
这代码是在已经确定输入合法的情况下写的。面对面试官时可得说清楚你认为的异常情况。显得咱思考问题全面。。。