这道题是逆波兰表达式求值。逆波兰表达式即操作符在其所有操作数之后的表达式。因为表达式已经转化为了逆波兰表达式,所以求值很简单。每次遇到操作符,就从栈里面取出来两个操作数,对其求值,把结果压栈。
重复代码较多,可以看http://www.programcreek.com/2012/12/leetcode-evaluate-reverse-polish-notation/有更简洁的java解法。
需要考虑的情况是操作数可以是负数,所以如果想自己把string转化为int,需要考虑这一点。
#include <iostream>
#include <stack>
#include <vector>
#include <cassert>
using namespace std;
class Solution {
public:
int toint(string str)
{
// caution: str may have sign, e.g. "-"
int num = 0;
for (int i = 0; i < str.size(); ++i)
{
num = num * 10 + str[i] - '0';
}
return num;
}
int evalRPN(vector<string> &tokens) {
stack<int> st;
for (int i = 0; i < tokens.size(); ++i)
{
if (tokens[i] == "+")
{
int num2 = st.top();
st.pop();
int num1 = st.top();
st.pop();
st.push(num1 + num2);
}
else if (tokens[i] == "-")
{
int num2 = st.top();
st.pop();
int num1 = st.top();
st.pop();
st.push(num1 - num2);
}
else if (tokens[i] == "*")
{
int num2 = st.top();
st.pop();
int num1 = st.top();
st.pop();
st.push(num1 * num2);
}
else if (tokens[i] == "/")
{
int num2 = st.top();
st.pop();
int num1 = st.top();
st.pop();
st.push(num1 / num2);
}
else
{
st.push(atoi(tokens[i].c_str()));
}
}
assert(st.size() == 1);
return st.top();
}
};
int main()
{
std::vector<string> tokens;
// tokens.push_back("2");
// tokens.push_back("1");
// tokens.push_back("+");
// tokens.push_back("3");
// tokens.push_back("*");
tokens.push_back("4");
tokens.push_back("13");
tokens.push_back("5");
tokens.push_back("/");
tokens.push_back("+");
Solution s;
cout<<s.evalRPN(tokens)<<endl;
return 0;
}