难点主要2个问题
1:识别出数字
方法1:
StringBuffer tmpStr = new StringBuffer();
if (cur >= '0' && cur <= '9')
tmpStr.append(cur);
int temInt = Integer.parseInt(tmpStr);
方法2:
int num = 0;
for(int i = 0; i < s.length(); i++){
char cur = s.charAt(i);
if(cur >= '0'){
num = num10 - '0' + cur;//如果为数字每次移动增大10倍
}

2:优先级运算
思路:用栈,当把加减乘除变成加法运算
遇到一个数字压一个数字
遇到减号,把数字取负号压入
遇到乘号,把前一个取出再乘上这个数,stack.push(stack.pop()num)
遇到除法,把前一个取出再除上这个数,stack.push(stack.pop()/num)
public long calculate(String s) {
// 保存上一个符号,初始为 +
char sign = '+';
Stack<integer> numStack = new Stack<>();
// 保存当前数字,如:12是两个字符,需要进位累加
int num = 0;
int result = 0;
for(int i = 0; i < s.length(); i++){
char cur = s.charAt(i);
if(cur >= '0'){
// 记录当前数字。先减,防溢出
num = num</integer>
10 - '0' + cur;
}
if((cur < '0' && cur !=' ' )|| i == s.length()-1){
// 判断上一个符号是什么
switch(sign){
// 当前符号前的数字直接压栈
case '+': numStack.push(num);break;
// 当前符号前的数字取反压栈
case '-': numStack.push(-num);break;
// 数字栈栈顶数字出栈,与当前符号前的数字相乘,结果值压栈
case '
': numStack.push(numStack.pop()*num);break;
// 数字栈栈顶数字出栈,除于当前符号前的数字,结果值压栈
case '/': numStack.push(numStack.pop()/num);break;
}
// 记录当前符号
sign = cur;
// 数字清零
num = 0;
}
}
// 将栈内剩余数字累加,即为结果
while(!numStack.isEmpty()){
result += numStack.pop();
}
return result;
}