Solution 1
不知道为什么这个题会被标记为中等,逆波兰表达式,使用栈即可完成模拟。
很久没用到switch了,注意表达式必须为数字(即需要处理成char)
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n为输入元素个数,完成所有运算符的计算,最坏情况下输入中应当有 n − 1 2 \frac{n - 1}{2} 2n−1个运算符
- 空间复杂度: O ( n ) O(n) O(n),其中 n n n为输入元素个数,保存所需的数字,最坏情况下输入中应当有 n + 1 2 \frac{n + 1}{2} 2n+1个数字,并且需要全部保存
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack <int> cache;
for (auto token: tokens) {
if ((token.size() > 1) || isdigit(token[0])) {
cache.push(stoi(token));
} else {
// 注意存在计算顺序
int num2 = cache.top();
cache.pop();
int num1 = cache.top();
cache.pop();
switch (token[0]) {
case '+':
cache.push(num1 + num2);
break;
case '-':
cache.push(num1 - num2);
break;
case '*':
cache.push(num1 * num2);
break;
case '/':
cache.push(num1 / num2);
break;
default:
cout << "INVALID OPERATOR" << endl;
break;
}
}
}
int ans = cache.top();
return ans;
}
};
Solution 2
Solution 1的Python实现,又遇到了负数除法需要向上取整的情形。
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
cache = list()
operator = {
"+": lambda a, b: a + b,
"-": lambda a, b: a - b,
"*": lambda a, b: a * b,
"/": lambda a, b: int(a / b), # 整数除法,但是负数是向上取整
}
for token in tokens:
if len(token) > 1 or token.isdigit(): # isdigit居然不支持负数
cache.append(int(token))
else:
num2 = cache.pop()
num1 = cache.pop()
# print(num1, token, num2)
cache.append(operator[token](num1, num2))
ans = cache[0]
return ans