leetcode--Evaluate Reverse Polish Notation
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> number;
for(int i = 0 ; i < tokens.size();i++)
{
if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/")
{
int n1 = 0;
int n2 = 0;
n1 = number.top();
number.pop();
n2 = number.top();
number.pop();
if(tokens[i] == "+")
number.push(n1+n2);
else if(tokens[i] == "-")
number.push(n2-n1);
else if(tokens[i] == "*")
number.push(n1*n2);
<span style="color:#ff0000;">else if(tokens[i] == "/")</span>
<span style="color:#ff0000;"> {// </span>
<span style="color:#ff0000;"> if(n1 != 0)</span>
<span style="color:#ff0000;"> number.push(n2/n1);</span>
}
}
else
{
number.push(atoi(tokens[i].c_str()));
}
}
if(!number.empty())//
return number.top();
}
};
以上のコードの実行中にエラーが発生しました:Last executed input:["0","3","/"]
原因は分母が0と判断していない場合にある.
小結:この問題自体は難易度が高くなく、stackを学んだことがある人なら、データ構造の本には関連する内容があるが、細部の問題は注意に値する.
1)vector
2)atoi()関数を使用して文字を整数に変換するときにエラーが発生しました.atoi()のパラメータはconst char*strですが、tokensはstringタイプです.
なお、char*とは異なり、stringは必ずしもNULL('0')で終わるとは限らない.string長さはlength()に基づいて得られ、stringは下付き文字に基づいてアクセスできる.したがって、stringをchar*に直接割り当てることはできません.stringをconst char*タイプに直接変換する場合.stringには2つの関数が使用できます.一つはc_str()は、dataメンバー関数です.
具体的にはchar*strとstringの関係についてhttp://blog.csdn.net/cogbee/article/details/8931838
3)最初は演算子をswitch構造で判別しようとしたが,C++ではswitchの選択因子は整数しかないことが分かった.最終的にif---else構造に移行します.
4)この問題の分母が0の場合など、特殊な状況も考慮しなければならない.