227.基本计算器 II
题目说明
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
示例
输入:s = “3+2*2”
输出:7
…
输入:s = " 3/2 "
输出:1
…
输入:s = " 3+5 / 2 "
输出:5
提示
- 1 <= s.length <= 3 * 105
- s 由整数和算符 (’+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开
- s 表示一个 有效表达式
- 表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
- 题目数据保证答案是一个 32-bit 整数
默认代码
int calculate(char * s){
}
解析
思路
有加减乘除四则运算,没有括号,说明优先级不会改变,那么可以先进行乘除运算,最后再将所有参数相加减。
有一个栈将这些数保存下来,最后将所有的数相加就可以。每一个数根据它的符号判断,执行不同的操作。对于加减号后面的数字,先存入栈顶,对于乘除的元素,直接进行乘除操作。
- “+”号,压栈;
- “-”号,取相反数后压栈;
- “*”或“\”,取出栈顶的元素,相乘或相除后再压栈。
代码(C)
int calculate(char *s)
{
int num = 0; //当前数字的大小
int i;
int n = strlen(s); //stack的长度与字符串的长度相等
int stk[n]; //定义一个stack来存储元素,从小往大生长
int index = 0; //记录stack栈顶位置
char preSign = '+'; //该数字左边的符号,默认为"+"
for (i = 0; i < n; i++) {
if ((s[i] == ' ') && (i != n - 1)) {
continue;
}
if (s[i] > 0x2f) { //数字
num = num * 10 + (s[i] - '0');
}
if ((s[i] <= 0x2f) || (i == n - 1)) { //符号
switch (preSign) {
case '+': {
stk[index++] = num;
break;
}
case '-': {
stk[index++] = -num;
break;
}
case '*': {
index--;
stk[index++] *= num;
break;
}
case '/': {
index--;
stk[index++] /= num;
break;
}
default: {
break;
}
}
num = 0;
preSign = s[i];
}
}
for (i = 0; i < index; i++) {
num += stk[i];
}
return num;
}