思路如下:
1、考虑采用栈解题。
2、对于±符号,对于一个数a,可以将其a或者-a的形式放入栈中
3、当遇到 */符号,取出栈顶元素,将其与当前数字进行相乘或者相除,得到结果放回栈中
4、遍历完整个字符串后,将得到的栈中的每个元素相加即可得到结果
class Solution {
public int calculate(String s) {
Stack<Integer> stack=new Stack<>();
char[] cs=s.toCharArray();
//定义初始的运算符号为+
char flag='+';
//遍历整个字符数组
for(int i=0;i<cs.length;i++){
//遇到空格,continue
if(cs[i]==' '){
continue;
}
//如果当前字符为数字
if(Character.isDigit(cs[i])){
int tmp=cs[i]-'0';
//不一定只有个位,可能是十位数百位数甚至更大
while(++i<cs.length&&Character.isDigit(cs[i])){
tmp=tmp*10+(cs[i]-'0');
}
//注意细节,i多加了一次,所以i--
i--;
//运算符为正号就放入栈
if(flag=='+'){
stack.push(tmp);
}
//为负,放入相反数
else if(flag=='-'){
stack.push(-tmp);
}
//如果是乘号或者除号,取出栈顶元素与当前数进行相乘或相除
else{
stack.push(res(flag,stack.pop(),tmp));
}
}
//如果不是数字,说明是运算符,赋给flag进行下一次遍历
else{
flag=cs[i];
}
}
//将栈中元素挨个相加即为结果
int result=0;
for(int n:stack){
result+=n;
}
return result;
}
//辅助函数
private int res(char c,int a,int b){
if(c=='*'){
return a*b;
}
else{
return a/b;
}
}
}
原题地址:
227. 基本计算器 II