本题使用栈数据结构根据逆波兰表达式计算算术表达式的值,逆波兰表达式也叫后缀表达式,将操作数放在前面,操作符放在后面,避免了使用括号和优先级歧义。本题关键点在于理解用栈计算后缀表达式的逻辑和如何判断一个字符数组中的各个字符串(含负数)是否为数字,而不是运算符。
下面代码采取的是首先判断字符数组中字符串长度,如果大于1,说明不只一个数,是十位以上的正数或者负数,不会是运算符。然后再判断或者字符串的第一个位置是数字,说明是个位的正数。
除去这种方法以外,因为运算符的种类是固定的,可以先判断是否是加减乘除运算符,如果不是,则是数字。
时间复杂度:O(n),空间复杂度:O(n)
思路:
- 定义一个栈st,对于每个token进行判断。
- 如果token的长度大于1(负数或者十位以上的正数)或者第一个字符是数字(正数),则将字符串转换成整数并将其压入栈st中。
- 否则说明token[i]是运算符,弹出栈顶的两个元素a和b,根据运算符计算结果并将结果压入栈st中。
- 返回栈顶元素即为最后的表达式的计算结果。
代码:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> st;
for (int i = 0; i < tokens.size(); i++) {
if (tokens[i].size() > 1 || isdigit(tokens[i][0])) // token长度大于1或者第一个字符是数字
st.push(stoi(tokens[i]));
else {
int b = st.top();
st.pop();
int a = st.top();
st.pop();
int result;
if (tokens[i] == "+")
result = a + b;
else if (tokens[i] == "-")
result = a - b;
else if (tokens[i] == "*")
result = a * b;
else if (tokens[i] == "/")
result = a / b;
st.push(result);
}
}
return st.top();
}
};