https://leetcode-cn.com/problems/calculator-lcci/
algorithm 10min
coding 35min
debug 15min
[bug]
1 first sign
2 last number
[buggy code]
class Solution {
public int calculate(String s) {
String str = s.trim();
int n = str.length();
Stack<Integer> numSt = new Stack<>();
Stack<Character> signSt = new Stack<>();
int sta = 0;
for(int i=0;i<n;i++){
char ch = str.charAt(i);
if(ch=='+' || ch=='-' || ch=='*' || ch=='/'){
int e = i-1;
int num = conv(str, sta, e);
numSt.push(num);
sta = i+1;
if(lv(signSt.peek())<lv(ch)){
signSt.push(ch);
continue;
}
else {
char preSign = signSt.pop();
int num1 = numSt.pop();
int num2 = numSt.pop();
numSt.push(calc(preSign, num1, num2));
signSt.push(ch);
}
}
}
while(signSt.isEmpty()){
char op = signSt.pop();
int num1 = numSt.pop();
int num2 = numSt.pop();
numSt.push(calc(op, num1, num2));
}
return numSt.pop();
}
int lv(char sign){
if(sign=='+' || sign == '-'){
return 1;
}
else if(sign=='*' || sign == '/'){
return 2;
}
return -1;
}
int calc(char sign, int num1, int num2){
if(sign=='+'){
return num1+num2;
}
else if(sign=='-'){
return num1-num2;
}
else if(sign=='*'){
return num1*num2;
}
else {
return num1/num2;
}
}
//"350" -> 350
int conv(String s, int l, int r){
int ret = 0;
for(int i=l;i<=r;i++){
int bit = s.charAt(i) - '0';
ret = ret*10 + bit;
}
return ret;
}
}```