Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are +
, -
, *
, /
. Each operand may be an integer or another expression.
Some examples:
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
思路:使用栈来将逆序变为中序,边变边计算。参考逆波兰式相关资料:
下面以(a+b)*c为例子进行说明:(a+b)*c的逆 波兰式为ab+c*,假设计算机把ab+c*按从左到右的顺序压入栈中,并且按照遇到 运算符就把栈顶两个元素 出栈,执行运算,得到的结果再入栈的原则来进行处理,那么ab+c*的执行结果如下:1)a入栈(0位置)2)b入栈(1位置)4)c入栈(1位置)经过以上运算,计算机就可以得到(a+b)*c的运算结果e了。
class Solution { public: int evalRPN(vector<string> &tokens) { stack<string> strStack; for(vector<string>::iterator iter=tokens.begin(); iter!=tokens.end(); iter++) { if(isdigit((*iter)[0]) || ((*iter)[0]=='-' && isdigit((*iter)[1]))) strStack.push(*iter); else { string v1,v2,v3; v1=strStack.top(); strStack.pop(); v2=strStack.top(); strStack.pop(); int i1,i2,i3; stringstream ss; ss<<v1; ss>>i1; ss.clear(); ss<<v2; ss>>i2; switch ((*iter)[0]) { case '+': i3=i2+i1;break; case '-': i3=i2-i1;break; case '*': i3=i2*i1;break; case '/': i3=i2/i1;break; } ss.clear(); ss<<i3; ss>>v3; strStack.push(v3); } } string resStr=strStack.top(); int res; stringstream ss; ss<<resStr; ss>>res; return res; } };