给你一个字符串表达式 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;// 返回最终的计算结果。
}