题目描述
数据示例
数据范围
首先我们先要知道什么是逆波兰表达式。如下:
找规律发现(其实题目已经给出了)逆波兰表达式可以用数据结构栈来求。
主要思路
- 遍历整个字符串数组
- 如果该字符串是数字(需要写一个check函数来判断),那么就把该字符串转换为int类型的数字,然后压入栈。
- 如果该字符串是运算符,那么取出当前栈上的前两个元素,然后做运算。
主要坑点
- 当字符数组的长度为1的时候,答案就是该数字。
- 运算的时候,假设一开始栈顶元素是a,出栈后,栈顶元素是b(相当于运算的两个数,所以要出栈两次),那么应该是b去运算a,例如运算符是 ‘/’ 或 ‘-’ 的时候,应该是b - a或者b / a。(楼主因为一开始直接拿a运算b然后调试了很久……)
- 假如遍历到的字符串为负数,那么应该判断他的长度是否大于1,(因为我是拿字符串的第一个字符来判断的,具体看我的check()函数),因为第一个字符如果为 ‘-’ 的话,可能这个数是负数,也有可能是减号。
这三个坑点直接令我WA了三次。。害。。
AC代码
class Solution {
public:
bool check(const string &s){
char ch = s[0];
if(ch == '-' && s.size() > 1) return true;
if(ch == '+' || ch == '-' || ch == '*' || ch == '/') return false;
return true;
}
int evalRPN(vector<string>& tokens) {
stack<int> st;
int ans = stoi(tokens[0]);
for(int i = 0, n = tokens.size(); i < n; i++){
if(check(tokens[i])){
int t = stoi(tokens[i]);
st.push(t);
}else{
int a = st.top();st.pop();
int b = st.top();st.pop();
if(tokens[i][0] == '+') ans = b + a;
else if(tokens[i][0] == '-') ans = b - a;
else if(tokens[i][0] == '*') ans = b * a;
else ans = b / a;
st.push(ans);
}
}
return ans;
}
};