Evaluate Reverse Polish Notation

来源:互联网 发布:电脑闹钟软件哪个好 编辑:程序博客网 时间:2024/05/14 02:33

Catalogue:string-类型转换

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

First 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;    }};

Second 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

Third 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

Fourth 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();    }};


0 0