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
class Solution {
public:
int evalRPN(vector<string> &tokens)
{
if (tokens.size() == 0)
return 0;
stack<int> sta;
int tmp1 = 0, tmp2 = 0;
sta.push(ToNum(tokens[0]));
for (int i=1;i<tokens.size();i++)
{
if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/")
{
tmp1 = sta.top();
sta.pop();
tmp2 = sta.top();
sta.pop();
}
if (tokens[i] == "+" )
sta.push(tmp1 + tmp2);
else if (tokens[i] == "-" )
sta.push(tmp2 - tmp1);
else if (tokens[i] == "*" )
sta.push(tmp1 * tmp2);
else if (tokens[i] == "/" )
sta.push(tmp2 / tmp1);
else
sta.push(ToNum(tokens[i]));
}
return sta.top();
}
int ToNum(string str)
{
int num = 0;
stringstream sin(str);
sin >> num;
return num;
}
};
测试
#include<sstream>
#include "head.h"
class Solution {
public:
int evalRPN(vector<string> &tokens)
{
if (tokens.size() == 0)
return 0;
stack<int> sta;
int tmp1 = 0, tmp2 = 0;
sta.push(ToNum(tokens[0]));
for (int i=1;i<tokens.size();i++)
{
if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/")
{
tmp1 = sta.top();
sta.pop();
tmp2 = sta.top();
sta.pop();
}
if (tokens[i] == "+" )
sta.push(tmp1 + tmp2);
else if (tokens[i] == "-" )
sta.push(tmp2 - tmp1);
else if (tokens[i] == "*" )
sta.push(tmp1 * tmp2);
else if (tokens[i] == "/" )
sta.push(tmp2 / tmp1);
else
sta.push(ToNum(tokens[i]));
}
return sta.top();
}
int ToNum(string str)
{
int num = 0;
stringstream sin(str);
sin >> num;
return num;
}
};
int main()
{
Solution s;
vector<string> tokens;
//["2", "1", "+", "3", "*"]
//["4", "13", "5", "/", "+"]
tokens.push_back("4");
tokens.push_back("13");
tokens.push_back("5");
tokens.push_back("/");
tokens.push_back("+");
cout<<s.evalRPN(tokens)<<endl;
}