LeetCode 227
https://leetcode.cn/problems/basic-calculator-ii/description/
难度:中等
高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/
本题是包含加减乘除,但没有括号的表达式求值。可以使用一个栈来解决。
使用 op 记录上一个运算符是什么。遍历字符串,如果当前字符是数字,就更新数字,如果是运算符或者已经到了最后一个字符,那么根据上一个运算符来操作。如果是加减,那么直接将当前数字加入栈中。如果是乘除,直接操作栈顶元素。然后将 op 更新为当前字符。
最后只需要将栈中所有元素加起来即可。为了方便遍历,栈使用 vector 实现。
时间复杂度:O(n),其中 n 为字符串 s 的长度。需要遍历字符串 s 一次,计算表达式的值。
空间复杂度:O(n),其中 n 为字符串 s 的长度。空间复杂度主要取决于栈的空间,栈的元素个数不超过 n。
class Solution {
public:
int calculate(string s) {
vector<int> stk;
char op = '+';
int num = 0;
int n = s.size();
for (int i = 0; i < n; i++) {
if (isdigit(s[i])) {
num = num * 10 + int(s[i] - '0');
}
if (!isdigit(s[i]) && s[i] != ' ' || i == n - 1) {
if (op == '+') {
stk.push_back(num);
} else if (op == '-') {
stk.push_back(-num);
} else if (op == '*') {
stk.back() *= num;
} else {
stk.back() /= num;
}
op = s[i];
num = 0;
}
}
int ans = 0;
for (int x : stk) {
ans += x;
}
return ans;
}
};