题目描述
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
示例 1:
输入:s = “3+2*2” 输出:7
示例 2:
输入:s = " 3/2 " 输出:1
方法:
每次遍历到数字末尾时,根据 数字前一个符号 来决定计算方式:
加号:将数字压入栈;
减号:将数字的相反数压入栈;
乘除号:计算数字与栈顶元素,并将栈顶元素替换为计算结果。
c实现
#define Max 100
int calculate(char * s){
int res = 0, d = 0;
char sign = '+';
int *nums;
int j = 0, tmp;
int strLen = strlen(s);
printf("strLen = %d \n",strLen);
nums = (int*)malloc(sizeof(int) * (strLen + 1));
memset(nums, 0, sizeof(int) * (strLen + 1));
for (int i = 0; i < strLen; i++) {
// 截取一个整数
if (s[i] >= '0') { // 加减乘除和空格ASCII码都小于'0'
d = d * 10 - '0' + s[i]; // 进位(先减法)
}
// 操作符处理
// "+" " - " 先入栈保存, 优先级低嘛,先保存着
// '*' '/' 需要直接和当前栈顶的计算,计算完后放回栈中保存
if ((s[i] < '0' && s[i] != ' ') || i == strLen - 1) { // 遍历到最后一个数字了, 需要进行处理
if (sign == '+') {
// printf("d1 = %d \n",d);
nums[j++] = d;
} else if (sign == '-') {
nums[j++] = -d;
} else if (sign == '*' || sign == '/') {
j--;
tmp = sign == '*' ? nums[j] * d : nums[j] / d;
// printf("tmp = %d \n",tmp);
nums[j++] = tmp;
}
sign = s[i];
d = 0;
}
}
// 处理还在栈的数字
for (; j >= 0; j--) {
res += nums[j];
}
return res;
}
问题
这个版本比较初级,不需要考虑异常校验