题目翻译:用反向波兰表示法计算算术表达式的值,有效的操作为+-*/这四种运算,每个运算可能是一个整数或是一个表达式。
测试用例:["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
题目给出的条件是:vector<string> &tokens
分析:
1、对于这种计算四则运算的表达式的题目,我们一定要想到使用栈。对于传统的有括号的加减乘除法,我们会使用数据栈和操作栈解决问题。但是我们看看到这个反向波兰表达式的问题,
2、题目给出的是一个vector的容器,同时我们发现反向波兰表达式只需要一个数据栈。因此我们使用迭代器从头开始遍历vector<stirng>遇到数字字符我们就将它压入数据栈。
3、当我们遇到操作符的字符时,我们首先取得栈顶元素tmp1,然后进行出栈操作,tmp1是加数或是减数,除数,乘数。之后我们再次获取栈顶元素tmp2.然后进行出栈操作。tmp2是被加数,被减数,被除数,被乘数。得到tmp1和tmp2后,我们使用当前操作符对两个数进行运算,得到的结果压入数据栈
4、重复上述步骤,知道对vector<string>的遍历结束,返回数据栈的栈顶元素,就是表达式的计算结果。
注意事项:
1、c++ 中的string 转为char *
2、c++ 中的string转为 int
3、变量不要重复定义
代码如下:
class Solution {
public:
int evalRPN(vector<string> &tokens) {
stack<int> tmp;
vector<string>::iterator i = tokens.begin();
for(i;i!=tokens.end();++i)
{
if(*i=="+"||*i=="-"||*i=="*"||*i=="/")
{
int top = tmp.top();
tmp.pop();
const char *p = (*i).c_str() ;
int new_top;
switch(p[0])
{
case '+': new_top=top+tmp.top();tmp.pop();tmp.push(new_top);
break;
case '-': new_top=tmp.top()-top;tmp.pop();tmp.push(new_top);
break;
case '*': new_top=top*tmp.top();tmp.pop();tmp.push(new_top);
break;
case '/': new_top=tmp.top()/top;tmp.pop();tmp.push(new_top);
break;
default :
break;
}
}
else
{
int interger_tmp = std::stoi(*i);
tmp.push(interger_tmp);
}
}
return tmp.top();
}
};