LeetCode OJ 之 Evaluate Reverse Polish Notation (求逆波兰表达式的值)

来源:互联网 发布:营养师网络兼职招聘 编辑:程序博客网 时间:2024/06/05 13:26

题目:

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
关于逆波兰表示法:

逆波兰记法中,操作符置于操作数的后面。例如表达“三加四”时,写作“3 4 +”,而不是“3 + 4”。如果有多个操作符,操作符置于第二个操作数的后面,所以常规中缀记法的“3 - 4 + 5”在逆波兰记法中写作“3 4 - 5 +”:先3减去4,再加上5。使用逆波兰记法的一个好处是不需要使用括号。例如中缀记法中“3 - 4 * 5”与“(3 - 4)*5”不相同,但后缀记法中前者写做“3 4 5 * -”,无歧义地表示“3 (4 5 *) −”;后者写做“3 4 - 5 *”。

思路:

先将操作数入栈;遇到操作符时,出栈两个操作数,求值,再将结果入栈;当一遍后,栈顶就是表达式的值。

这里有一个问题是,所给的操作数和操作符是以字符串string形式给出,计算时需要将字符串转化成int型数,可以使用stoi()函数,也可以自己定义函数转化。

代码1:

class Solution {public:    int evalRPN(vector<string> &tokens)    {        stack<int> stk;        if(tokens.empty())            return 0;        for(int i = 0 ; i < tokens.size() ; i++)        {            int value = 0x7fffffff;            char a = '\0';            value = string_to_int(tokens[i],a);//调用stoi函数把string转化为操作数或者操作符            //当为操作数时,入栈            if(value != 0x7fffffff && a == '\0')                stk.push(value);            else                //当s为操作符时,先出栈计算,然后再把结果入栈                if(value == 0x7fffffff && a != '\0')                {                    int pre_2,pre_1;//pre_1为前一个操作数,pre_2为后一个操作数                    int new_value = 0;//计算后的新值                    if(!stk.empty())                    {                        pre_2 = stk.top();                        stk.pop();                    }                    if(!stk.empty())                    {                        pre_1 = stk.top();                        stk.pop();                    }                    switch(a)                    {                        case '+':                            new_value = pre_1 + pre_2;                            break;                        case '-':                            new_value = pre_1 - pre_2;                            break;                        case '*':                            new_value = pre_1 * pre_2;                            break;                        case '/':                            new_value = pre_1 / pre_2;                            break;                    }                    stk.push(new_value);//新值入栈                }        }        return stk.top();//返回栈顶,即为结果    }    //stoi函数,a是操作符,a如果为空,说明当前字符串s是操作数,如果不为空说明s是操作符    int string_to_int(string s , char & a)    {        int value = 0x7fffffff;        int len = s.size();        if(len < 1)            return value;        //s只有一个字符时,判断是否是操作符        if(len == 1)        {            char tmp = s[0];            if(tmp == '+' || tmp == '-' || tmp == '*' || tmp == '/')            {                a = s[0];                return value;            }        }        //s为操作数时,把它转化为int型,注意操作数为负数时的情况        value = 0;        a = '\0';//把a置为空        //为负数时的情况        if(s[0] == '-')        {            for(int i = 1 ; i < len ; i++)            {                value = value *10 + (s[i] - '0' );            }            value = value * (-1);        }        else            for(int i = 0 ; i < len ; i++)            {                value = value *10 + (s[i] - '0' );            }                return value;    }};

代码2:

class Solution {public:    int evalRPN(vector<string> &tokens)    {        stack<int> stk;        if(tokens.empty())            return 0;        for(int i = 0 ; i < tokens.size() ; i++)        {            string cur = tokens[i];            //如果不是操作符,则把它转换成int型,然后入栈            if(!is_operator(cur))                stk.push(stoi(cur));            else                {                    int pre_2 = stk.top();                    stk.pop();                    int pre_1 = stk.top();                    stk.pop();                    if(cur == "+")                        stk.push(pre_1 + pre_2);                    else                        if(cur == "-")                            stk.push(pre_1 - pre_2);                        else                            if(cur == "*")                                stk.push(pre_1 * pre_2);                            else                                stk.push(pre_1 / pre_2);                                    }                        }        return stk.top();    }    //判断s是否是操作符    bool is_operator(string s)    {        string str("+-*/");        //string::npos表示在str中没有查找到s[0]时的返回值,find的中的0表示从头开始查找        if(s.size() == 1)            return str.find(s[0],0) != string::npos ? true : false ;        return false;    }};






0 0
原创粉丝点击