原本以为这道题分分钟就能做完,谁能想到,我特喵做了1个半小时。
小丑竟是我自己!!!
原题
很显然直接使用栈来解决就可以的题目。
先说一下思路哈
在这里说一下,需要知道的基础的东西
string转化为int类型
请使用
atoi()
功能:将字符串str转换成一个整数并返回结果。参数str 以数字开头,当函数从str 中读到非数字字符则结束转换并将结果返回。例如,
i = atoi( “512.035” );
i 的值为 512.
如果还是没懂,请看这个文章。
至于如何判断不是操作数这个环节:
请先检查string的长度是否是大于1的,或者第一个字符是不是数字。只要满足其中一个条件那就妥妥的数字了。
为什么需要注意运算时的顺序呢?
给大家一段代码,看一下
int a = stk.top();
stk.pop();
int b = stk.top();
stk.pop();
如果此时我们的栈空间是这样的
13 , 5
请问a/b的结果是什么?
你以为是 13 / 5 吗?
错,会变成 5 / 13 。
所以这里一定要注意
到这里还没懂?OK,直接请你去看动画版
最后上代码:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
int len = tokens.size();
stack<int> stk;
for(int i = 0;i < len;i++){
if(tokens[i].length() > 1 || isdigit(tokens[i][0])){
//如果字符串的长度是大于1的或者第一个字符为数字时,肯定是数字
//数字需要进栈,当然需要先转化为int
stk.push(atoi(tokens[i].c_str()));
}else{
//说明此时是操作符,按照给定的操作符进行运算
int a = stk.top();
stk.pop();
int b = stk.top();
stk.pop();
switch(tokens[i][0]){
case '+':
stk.push(b + a);
break;
case '-':
stk.push(b - a);
break;
case '*':
stk.push(b * a);
break;
case '/':
// cout<<b<<" / "<<a<<" = "<<a/b<<endl;
stk.push(b / a);
break;
}
// cout<<stk.top()<<endl;
}
}
return stk.top();
}
};
cs