leetcode_题解_Evaluate Reverse Polish Notation逆波兰式

来源:互联网 发布:wit.ai api.ai 知乎 编辑:程序博客网 时间:2024/05/21 06:16

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
思路:使用栈来将逆序变为中序,边变边计算。参考逆波兰式相关资料:
下面以(a+b)*c为例子进行说明:
(a+b)*c的逆波兰式为ab+c*,假设计算机把ab+c*按从左到右的顺序压入栈中,并且按照遇到运算符就把栈顶两个元素出栈,执行运算,得到的结果再入栈的原则来进行处理,那么ab+c*的执行结果如下:
1)a入栈(0位置)
2)b入栈(1位置)
3)遇到运算符“+”,将a和b出栈,执行a+b的操作,得到结果d=a+b,再将d入栈(0位置)
4)c入栈(1位置)
5)遇到运算符“*”,将d和c出栈,执行d*c的操作,得到结果e,再将e入栈(0位置)
经过以上运算,计算机就可以得到(a+b)*c的运算结果e了。
逆波兰式除了可以实现上述类型的运算,它还可以派生出许多新的算法,数据结构,这就需要灵活运用了。逆波兰式只是一种序列体现形式。
class Solution {public:    int evalRPN(vector<string> &tokens) {       stack<string> strStack;for(vector<string>::iterator iter=tokens.begin(); iter!=tokens.end(); iter++){if(isdigit((*iter)[0]) || ((*iter)[0]=='-' && isdigit((*iter)[1])))strStack.push(*iter);else{string v1,v2,v3;v1=strStack.top();strStack.pop();v2=strStack.top();strStack.pop();int i1,i2,i3;stringstream ss;ss<<v1;ss>>i1;ss.clear();ss<<v2;ss>>i2;switch ((*iter)[0]){case '+':i3=i2+i1;break;case '-':i3=i2-i1;break;case '*':i3=i2*i1;break;case '/':i3=i2/i1;break;}  ss.clear();ss<<i3;ss>>v3;strStack.push(v3);}}string resStr=strStack.top();int res;stringstream ss;ss<<resStr;ss>>res;return res;    }    };


0 0
原创粉丝点击