就是两个栈用来用去,随便记录下
class Solution {
public int calculate(String s) {
if(s.length() == 0) return 0;
Stack<Integer> nums = new Stack<>();
Stack<Character> sbo = new Stack<>();
int start = 0;
int num = 0;
while(start < s.length()){
int[] res = nextNum(s,start);
num = res[0];
int end = res[1];
char symbol = ' ';
if(end < s.length()){
symbol = s.charAt(end);
}
nums.push(num);
if(!sbo.empty() && (sbo.peek() == '*' || sbo.peek() == '/')){
func(nums,sbo);
}
if(symbol == '+' || symbol == '-'){
if(!sbo.empty() && (sbo.peek() == '+' || sbo.peek() == '-')){
func(nums,sbo);
}
}
if(symbol != ' ') sbo.push(symbol);
start = end+1;
}
while(!sbo.empty()){
func(nums,sbo);
}
return nums.peek();
}
private void func(Stack<Integer> nums,Stack<Character> sbo){
Character ch = sbo.pop();
int j = nums.pop();
int i = nums.pop();
int sum = 0;
switch (ch){
case '+':
sum = i+j;
break;
case '-':
sum = i-j;
break;
case '*':
sum = i*j;
break;
case '/':
sum = i/j;
break;
}
nums.push(sum);
}
private int[] nextNum(String s,int i){
int[] res = new int[2];
int num = 0;
boolean flag = false;
for(;i<s.length();i++){
char ch = s.charAt(i);
if(ch == ' ') continue;
if(ch == '+' || ch =='-' || ch =='/' || ch == '*') break;
flag = true;
num = num * 10 + ch - '0';
}
if(flag){
res[0] = num;
res[1] = i;
}
else{
res[0] = -1;
res[1] = i;
}
return res;
}
}