给你一个字符串表达式 s
,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1]
的范围内。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()
。
示例 1:
输入:s = "3+2*2" 输出:7
示例 2:
输入:s = " 3/2 " 输出:1
示例 3:
输入:s = " 3+5 / 2 " 输出:5
提示:
1 <= s.length <= 3 * 105
s
由整数和算符('+', '-', '*', '/')
组成,中间由一些空格隔开s
表示一个 有效表达式- 表达式中的所有整数都是非负整数,且在范围
[0, 231 - 1]
内 - 题目数据保证答案是一个 32-bit 整数
解题思路:
1.加号:将数字压入栈;
2.减号:将数字的相反数压入栈;
3.乘除号:计算数字与栈顶元素,并将栈顶元素替换为计算结果。
int isNum(char s)
{
if (s >= '0' && s <= '9') {
return 1;
}
return 0;
}
int calculate(char* s) {
int n = strlen(s);
int stack[10000000], top = 0;
int num = 0;
char preSign = '+';
for (int i = 0; i < n; i++) {
if (isNum(s[i]) == 1) {
num = num * 10 + (int)(s[i] - '0');
}
if (!isNum(s[i]) && s[i] != ' ' || i == n - 1) {
switch (preSign) {
case '+':
stack[top++] = num; // 加法和减法进栈
break;
case '-':
stack[top++] = -num;
break;
case '*':
stack[top - 1] *= num; //乘法直接栈顶数据和num相乘
break;
default:
stack[top - 1] /= num; //乘法直接栈顶数据和num相乘
}
preSign = s[i];
num = 0;
}
}
int ret = 0;
for (int i = 0; i < top; i++) {
ret += stack[i];
}
return ret;
}