Evaluate Reverse Polish Notation (STRING-TYPE CONVERTION)

Question

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

1ST TRY

class Solution {

public:

    int evalRPN(vector<string> &tokens) {

        int operant1;

        int operant2;

        string str;

        int ret;

        bool firstOp = false;

        

        for(int i = 0; i < tokens.size(); i++)

        {

            str = tokens[i];

            if(!firstOp)

            {

                operant1 = getInt(str);;

                firstOp = true;

            }

            else if(str == "+")

            {

                ret = operant1 + operant2;

            }

            else if(str == "-")

            {

                ret = operant1 - operant2;

            }

            else if(str == "*")

            {

                ret = operant1 * operant2;

            }

            else if(str == "/")

            {

                ret = operant1 / operant2;

            }

            else

            {

                operant2 = getInt(str);

                firstOp = false;

            }

        }

        

        return ret;

    }

    int getInt(string str)

    {

        int ret = 0;

        for(int i = 0; i < str.length(); i++)

        {

            ret = ret*10 + str[i];

        }

        return ret;

    }

};

 

2ND TRY

考虑只有一个操作数的情况

class Solution {

public:

    int evalRPN(vector<string> &tokens) {

        int operant1;

        int operant2;

        string str;

        int ret;

        bool firstOp = false;

        

        for(int i = 0; i < tokens.size(); i++)

        {

            str = tokens[i];

            if(!firstOp)

            {

                operant1 = getInt(str);

                firstOp = true;

            }

            else if(str == "+")

            {

                operant1 += operant2;

            }

            else if(str == "-")

            {

                operant1 -= operant2;

            }

            else if(str == "*")

            {

                operant1 *= operant2;

            }

            else if(str == "/")

            {

                operant1 /= operant2;

            }

            else

            {

                operant2 = getInt(str);

            }

        }

        return operant1;

    }

    

    int getInt(string str)

    {

        int ret = 0;

        for(int i = 0; i < str.length(); i++)

        {

            ret = ret*10 + (str[i]-'0');

        }

        return ret;

    }

};

Result: Wrong

Input: ["3","-4","+"]
Output: -23
Expected: -1

3RD TRY

考虑负数的情况

class Solution {

public:

    int evalRPN(vector<string> &tokens) {

        int operant1;

        int operant2;

        int ret;

        string str;

        stack<int> operantStack;

        

        for(int i = 0; i < tokens.size(); i++)

        {

            str = tokens[i];

            if(str == "+")

            {

                operant2 = operantStack.top();

                operantStack.pop();

                operant1 = operantStack.top();

                operantStack.pop();

                operantStack.push(operant1 + operant2);

            }

            else if(str == "-")

            {

                operant2 = operantStack.top();

                operantStack.pop();

                operant1 = operantStack.top();

                operantStack.pop();

                operantStack.push(operant1 - operant2);

            }

            else if(str == "*")

            {

                operant2 = operantStack.top();

                operantStack.pop();

                operant1 = operantStack.top();

                operantStack.pop();

                operantStack.push(operant1 * operant2);

            }

            else if(str == "/")

            {

                operant2 = operantStack.top();

                operantStack.pop();

                operant1 = operantStack.top();

                operantStack.pop();

                operantStack.push(operant1 / operant2);

            }

            else

            {

                operantStack.push(getInt(str));

            }

        }

        return operantStack.top();

    }

    

    int getInt(string str)

    {

        int ret = 0;

        bool negFlag = false;

        for(int i = 0; i < str.length(); i++)

        {

            if(str[i]=='-') negFlag = true;

            else if(negFlag)

            {

                ret = ret*10 - (str[i]-'0');

            }

            else

            {

                ret = ret*10 + (str[i]-'0');

            }

        }

        return ret;

    }

};

Result: Accepted

4TH TRY

使用内置函数atoi将string转换成int

class Solution {

public:

    int evalRPN(vector< string > &tokens) {

        stack< int > operandStack;

        int operand1;

        int operand2;

        for(int i = 0; i < tokens.size(); i++){

            if(tokens[i]=="+"){

                operand1 = operandStack.top();

                operandStack.pop();

                operand2 = operandStack.top();

                operandStack.pop();

                operand2 += operand1;

                operandStack.push(operand2);

            }

            else if(tokens[i]=="-"){

                operand1 = operandStack.top();

                operandStack.pop();

                operand2 = operandStack.top();

                operandStack.pop();

                operand2 -= operand1;

                operandStack.push(operand2);

            }

            else if(tokens[i]=="*"){

                operand1 = operandStack.top();

                operandStack.pop();

                operand2 = operandStack.top();

                operandStack.pop();

                operand2 *= operand1;

                operandStack.push(operand2);

            }

            else if(tokens[i]=="/"){

                operand1 = operandStack.top();

                operandStack.pop();

                operand2 = operandStack.top();

                operandStack.pop();

                operand2 /= operand1;

                operandStack.push(operand2);

            }

            else{

                operand1 = atoi(tokens[i].c_str());

                operandStack.push(operand1);

            }

        }

        return operandStack.top();

    }

};

Result: Accepted

你可能感兴趣的:(convert)