力扣227:基本计算器II
给你一个字符串表达式 s
,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1]
的范围内。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()
。
示例 1:
输入:s = "3+2*2" 输出:7
示例 2:
输入:s = " 3/2 " 输出:1
示例 3:
输入:s = " 3+5 / 2 " 输出:5
代码:
int calculate(char *s) {
int len = strlen(s);
// 获取输入字符串的长度。
int stack[len];
// 定义一个整数数组 stack,用于模拟栈,存储中间结果。
int top = 0;
// 定义一个变量 top,用于表示栈顶位置,初始值为 0,表示栈为空。
long ans = 0;
// 定义一个长整型变量 ans,用于存储最终的计算结果。
long num = 0;
// 定义一个长整型变量 num,用于临时存储数字。
char sign = '+';
// 定义一个字符变量 sign,用于记录上一个操作符,初始值为 '+'。
for (int i = 0; i <= len; i++) {
// 遍历输入字符串。
if (isdigit(s[i])) {
num = num * 10 + (s[i] - '0');
// 如果当前字符是数字,将其转换为数字并累加到 num 中。
} else {
if (s[i] == ' ') {
continue;
}
// 如果当前字符是空格,跳过。
if (sign == '+') {
stack[top++] = num;
} else if (sign == '-') {
stack[top++] = -num;
} else if (sign == '*') {
stack[top - 1] *= num;
} else if (sign == '/') {
stack[top - 1] /= num;
}
// 根据上一个操作符 sign 的值,对 num 进行相应的操作,并将结果存入栈中。
sign = s[i];
// 更新 sign 为当前操作符。
num = 0;
// 重置 num 为 0,准备下一个数字的读取。
}
}
while (top > 0) {
ans += stack[--top];
}
// 遍历栈,将栈中的所有元素相加,得到最终结果。
return ans;
// 返回最终的计算结果。
}