evaluate-reverse-polish-notation

来源:互联网 发布:无法连接至steam网络 编辑:程序博客网 时间:2024/06/11 05:31

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

逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法,按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。
它的优势在于只用两种简单操作,入栈和出栈就可以搞定任何普通表达式的运算。其运算方式如下:
如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。是后出栈的除以或者减去前面出栈的。

将一个普通的中序表达式转换为逆波兰表达式的一般算法是:
(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。
(2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。
(3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。
(4)如果不是数字,该字符则是运算符,此时需比较优先关系。
做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将栈顶的运算符从栈中弹出,直到栈顶运算符的优先级低于当前运算符,将该字符入栈。
(5)重复上述操作(3)-(4)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。

class Solution {public:    int evalRPN(vector<string> &tokens) {        if(tokens.empty())            throw string{"wrong"};        stack<int> sta;        for(int i=0;i!=tokens.size();++i)            {            if(tokens[i]=="+"&&!sta.empty())                {                int a=sta.top();                sta.pop();                int b=sta.top();                sta.pop();                sta.push(a+b);            }            else if(tokens[i]=="-"&&!sta.empty())                {                int a=sta.top();                sta.pop();                int b=sta.top();                sta.pop();                sta.push(b-a);            }            else if(tokens[i]=="*"&&!sta.empty())                {                int a=sta.top();                sta.pop();                int b=sta.top();                sta.pop();                sta.push(a*b);            }            else if(tokens[i]=="/"&&!sta.empty())                {                int a=sta.top();                sta.pop();                int b=sta.top();                if(a==0)                    return -1;                sta.pop();                sta.push(b/a);            }            else                sta.push(atoi(tokens[i].c_str()));        }        if(!sta.empty())            return sta.top();        return -1;    }};
0 0
原创粉丝点击