实现一个基本的计算器 https://leetcode.com/problems/basic-calculator-ii/
支持简单的’+’,’-‘,’*’,’/’功能。之前在学数据结构的Stack时有提到过如何用栈来实现计算器,就是用两个栈:操作数栈和运算符栈。写了一上午才AC,有两个问题。
第一:怎么确定计算逻辑。在没有括号的情况下,应该是碰到加号之后,前面的运算符应该全部运算完毕,也就是操作数栈应该只有一个数,运算符栈应该为空。碰到’*,/’之后,应该是将’*,/’左右的两个数直接得出运算结果。这是两个基本逻辑。
第二:也是在submit后才发现的问题,说输入”42”,发现我的输出是4。原来我没有考虑连续的数字即多位数的情况,应该要识别连续的一串数字为多位数的情况。
代码如下:
public int calculate(String s) {
if(s.length() == 0){
return 0;
}
Stack<Integer> number = new Stack<Integer>();
Stack<Character> operator = new Stack<Character>();
char tmp, oper;
int n1, n2;
int cum = 0;
for(int i = 0; i < s.length(); i++){
tmp = s.charAt(i);
if(tmp == ' ')
continue;
else if(tmp >= '0' && tmp <= '9'){
cum = 10*cum + (tmp - '0');
if(i+1 < s.length() && s.charAt(i+1) >= '0' && s.charAt(i+1) <= '9'){
continue;
}
//number.push(tmp);
if(!operator.isEmpty()){
oper = operator.peek();
if(oper == '*'){
n1 = number.pop();
number.push(n1*cum);
operator.pop();
}else if(oper == '/'){
n1 = number.pop();
number.push(n1/cum);
operator.pop();
}else{
number.push(cum);
}
cum = 0;
}else{
//第一次
number.push(cum);
cum = 0;
}
}else if(tmp == '+' || tmp == '-'){
if(!operator.isEmpty()){
n1 = number.pop();
n2 = number.pop();
oper = operator.pop();
if(oper == '+')
number.push(n2+n1);
else if(oper == '-')
number.push(n2-n1);
}
operator.push(tmp);
}else if(tmp == '*' || tmp == '/'){
operator.push(tmp);
}
}
//以加减法结尾
if(!operator.isEmpty()){
oper = operator.pop();
n1 = number.pop();
n2 = number.pop();
if(oper == '+')
return n2 + n1;
else
return n2 - n1;
}else{
//
return number.pop();
}
}
感觉代码不够简洁有木有。