0.踩雷:有关size_t 、long long int 和stoi、atoi
①atoi是将const char* 转化为int类型,但用size_t来接收的时候,会出现溢出的现象
②stoi是将const string转化为int类型,同样的也不能用size_t来接收参数
解决:用long long int 来接收
一、题目描述
个人原先的解法:
class Solution
{
public:
bool checkIsNum(string ch)
{
string tmplate[4]={"+","-","*","/"};
bool flg=true;
for(string v:tmplate)
{
if(v==ch)
flg=false;
}
return flg;
}
int evalRPN(vector<string>& tokens)
{
stack<long long int> nums;
string tmp;long long int left=0,right=0;//左右操作数
for(auto v:tokens)
{
tmp=v.c_str(); //tmp是const char*类型
if(checkIsNum(tmp))
nums.push(stoi(tmp)); //是数字才需要atoi进行转化为数字
else//说明是操作符
{
right=nums.top();nums.pop();
left=nums.top();nums.pop();
switch(tmp.c_str()[0])
{
case '+':
nums.push(left+right);break;
case '-':
nums.push(left-right);break;
case '*':
nums.push(left*right);break;
case '/':
nums.push(left/right);break;
}
}
}
return nums.top();
}
};
三、参考代码
参考代码很简洁,建议学习这种风格
class Solution { public: int evalRPN(vector<string>& tokens) { stack<int> st; for (int i = 0; i < tokens.size(); i++) { if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") { long long int num1 = st.top(); st.pop(); long long int num2 = st.top(); st.pop(); if (tokens[i] == "+") st.push(num2 + num1); if (tokens[i] == "-") st.push(num2 - num1); if (tokens[i] == "*") st.push(num2 * num1); if (tokens[i] == "/") st.push(num2 / num1); } else { st.push(stoi(tokens[i])); } } int result = st.top(); st.pop(); // 把栈里最后一个元素弹出(其实不弹出也没事) return result; } };