LeetCode(150) Evaluate Reverse Polish Notation

6600 ワード

タイトル
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

ぶんせき
本題はスタックの応用を考査し,接尾辞式の値を計算する.
データ構造、スタックの章を参照してください.
ACコード
class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        if (tokens.empty())
            return 0;

        //     
        stack<int> s;

        //tokens  
        int size = tokens.size();
        for (int i = 0; i < size; ++i)
        {
            if (!isOper(tokens[i]))
            {
                s.push(strToInt(tokens[i]));
            }
            else{
                char op = tokens[i][0];
                switch (op)
                {
                    int op1, op2;
                case '+':
                    op1 = s.top();
                    s.pop();
                    op2 = s.top();
                    s.pop();
                    s.push(op2 + op1);
                    break;
                case '-':
                    op1 = s.top();
                    s.pop();
                    op2 = s.top();
                    s.pop();
                    s.push(op2 - op1);
                    break;
                case '*':
                    op1 = s.top();
                    s.pop();
                    op2 = s.top();
                    s.pop();
                    s.push(op2 * op1);
                    break;
                case '/':
                    op1 = s.top();
                    s.pop();
                    op2 = s.top();
                    s.pop();
                    s.push(op2 / op1);
                    break;
                default:
                    break;
                }//switch
            }//else
        }//for
        return s.top();

    }

    //        
    bool isOper(string &str)
    {
        if (str.size() > 1)
            return false;

        if (str[0] == '+' || str[0] == '-' || str[0] == '*' || str[0] == '/')
            return true;
        return false;
    }

    //         
    int strToInt(string &str)
    {
        if (str.empty())
            return 0;

        //       
        int size = str.size();

        int flag = 1, pos = 0, sum = 0, multi = 1;
        if (str[0] == '-')
        {
            flag = -1;
            pos = 1;
        }

        for (int i = size - 1; i >= pos; --i)
        {
            sum += (str[i] - '0') * multi;
            multi *= 10;
        }

        return flag * sum;
    }
};

GitHubテストプログラムソースコード