核心思路
先算乘除,再算加减。
对于加减号后的数字,将其直接压入栈中;对于乘除号后的数字,可以直接与栈顶元素计算,并替换栈顶元素为计算后的结果。
由于乘除优先于加减计算,因此不妨考虑先进行所有乘除运算,并将这些乘除运算后的整数值放回原表达式的相应位置,则随后整个表达式的值,就等于一系列整数加减后的值。
题目
https://leetcode-cn.com/problems/basic-calculator-ii/
分析
若读到一个运算符,或者遍历到字符串末尾,即认为是遍历到了数字末尾。处理完该数字后,更新 preSign 为当前遍历的字符。
代码
class Solution {
public int calculate(String s) {
Deque<Integer> stack=new LinkedList<>();
int len=s.length();
char preSign='+';//记录前一个符号
int num=0;
for(int i=0;i<len;i++){
if(Character.isDigit(s.charAt(i))){
num=num*10+s.charAt(i)-'0';
}
//这里注意不用else if 因为考虑到最后一个是数字要加上去
if(!Character.isDigit(s.charAt(i))&&s.charAt(i)!=' '||i==len-1){
if(preSign=='+'){
stack.push(num);
}
else if(preSign=='-'){
stack.push(-num);
}
else if(preSign=='*'){
int a=stack.pop();
stack.push(a*num);
}
else if(preSign=='/'){
int a=stack.pop();
stack.push(a/num);
}
num=0;
preSign=s.charAt(i);
}
}
int res=0;
while(!stack.isEmpty()){
res+=stack.pop();
}
return res;
}
}