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&tokensというパラメータは文字列のコンテナで、中の演算子はすべて文字列形式で格納されています:「+」「-」「*」/」は単引用符の1文字ではなく、「a」が文字aを表すのに相当しますが、「a」は実は文字列'a'+'0'です
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の場合など、特殊な状況も考慮しなければならない.