题目链接
逆波兰表达式(RPN)
Reverse Polish notation
逆波兰表达式又叫做后缀表达式。逆波兰表示法是波兰逻辑学家J・卢卡西维兹(J・ Lukasiewicz)于1929年首先提出的一种表达式的表示方法。后来,人们就把用这种表示法写出的表达式称作“逆波兰表达式”。逆波兰表达式把运算量写在前面,把算符写在后面。
举例:
算法
核心是利用栈,流程举例如下:
1.判断是否为运算符号
2.否,压栈
3.是,弹栈(弹出两个元素)。注意元素的运算顺序,应该是后面的op前面的。用switch判断运算符。运算结果压栈。
4.重复循环
代码
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int>s;
int len = tokens.size();
for(int i = 0;i<len;i++){
char a = tokens[i][0];
if((a=='+'||a=='-'||a=='*'||a=='/')&&tokens[i].length()==1){
int t1 = s.top();
s.pop();
int t2 = s.top();
s.pop();
switch(a){
case '+':
s.push(t2+t1);
break;
case '-':
s.push(t2-t1);
break;
case '*':
s.push(t2*t1);
break;
case '/':
s.push(t2/t1);
break;
}
}else{
istringstream ss(tokens[i]);
int c;
ss>>c;
s.push(c);
}
}
return s.top();
}
};
一些小细节
1.字符串数组vetcor长度
vector.size()
即可
2.符号判断
方法很多,这里直接取第一个元素并判断串的长度是不是为1(不加这个判断,类似-11这种负数的处理会出错,因为负号被识别为减号)
3.字符串转int
方法很多,代码中使用
istringstream ss(tokens[i]);
int c;
ss>>c;
s.push(c);
注意包含头文件sstream(如果是本地调试的话)
也可以这么写:
if (isNumber(token)) {
stk.push(atoi(token.c_str()));
}
注意两个函数atoi和c_str的用法。