题目描述
给你一个字符串表达式s
,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
样例
输入:s = "3+2*2"
输出:7
算法
栈模拟
时间复杂度
O ( n ) O(n) O(n)
Java 代码
class Solution {
int[] stk1;
char[] stk2;
int tt1 = 0, tt2 = 0;
int solve(int a, int b, char op) {
int ans = 0;
switch (op) {
case '+' : ans = a + b; break;
case '-' : ans = a - b; break;
case '*' : ans = a * b; break;
case '/' : ans = a / b; break;
}
return ans;
}
public int calculate(String s) {
int len = s.length();
stk1 = new int [2 * len];
stk2 = new char [2 * len];
int begin = 0;
if (s.charAt(0) == '-') {
stk1[ ++ tt1] = 0;
stk2[ ++ tt2] = '-';
begin = 1;
}
int flag = 0;
int nega = 0;
for (int i = begin; i < len; i ++ ) {
char c = s.charAt(i);
if (c == ' ') continue;
if (c >= '0' && c <= '9') {
int num = 0;
int idx = i;
while (idx < len && s.charAt(idx) >= '0' && s.charAt(idx) <= '9') {
num = num * 10 + (s.charAt(idx) - '0');
idx ++ ;
}
i = idx - 1;
if (nega == 1) {
stk1[ ++ tt1] = -num;
nega = 0;
} else {
stk1[ ++ tt1] = num;
}
// 高优先级运算符优先运算
if (flag == 1) {
int a = stk1[tt1 -- ];
int b = stk1[tt1 -- ];
char o = stk2[tt2 -- ];
int ans = solve(b, a, o);
stk1[ ++ tt1] = ans;
flag = 0;
}
} else {
if (c == '*' || c == '/') {
flag = 1;
stk2[ ++ tt2] = c;
}
else if (c == '-') {
nega = 1;
stk2[ ++ tt2] = '+';
}
else
stk2[ ++ tt2] = c;
}
}
if (tt1 > 1) {
while (tt2 > 0) {
int a = stk1[tt1 -- ];
int b = stk1[tt1 -- ];
char o = stk2[tt2 -- ];
int ans = solve(b, a, o);
stk1[ ++ tt1] = ans;
}
}
return stk1[tt1];
}
}