一、问题描述
Implement a basic calculator to evaluate a simple expression string.
The expression string may contain open (
and closing parentheses )
, the plus +
or minus sign -
, non-negative integers and empty spaces .
You may assume that the given expression is always valid.
Some examples:
"1 + 1" = 2 " 2-1 + 2 " = 3 "(1+(4+5+2)-3)+(6+8)" = 23
Note: Do not use the eval
built-in library function.
二、我的思路
想到在出现括号时用栈,但不知道java的栈怎么写……另外具体的边界条件也没想清楚。借鉴了discuss里的思路以后,写了代码
class Solution {
public int calculate(String s) {
char[] c = s.toCharArray();
Stack<Integer> stack = new Stack<Integer>();
int result = 0;
int sign = 1;
for(int i = 0; i < c.length; i ++){
switch(c[i]){
case '(':
stack.push(sign);
stack.push(result);
result = 0;
sign = 1;
break;
case ')':
result = stack.pop() + stack.pop()*result;
break;
case '+':
sign = 1;
break;
case '-':
sign = -1;
break;
case ' ':
break;
default:
if(Character.isDigit(c[i])){
int sum = c[i] - '0';
while(i + 1 <= c.length -1 && Character.isDigit(c[i+1])){ // Mind the condition!!!
sum = sum*10 + c[i + 1] - '0';
i ++;
}
result += sign * sum;
}
break;
}
}
return result;
}
}
注意while的条件,以及sign和result什么时候复原。
三、淫奇技巧
思路都差不多,就是对五种字符分别处理,不同的是number的处理更优美了。
public int calculate(String s) {
Stack<Integer> stack = new Stack<Integer>();
int result = 0;
int number = 0;
int sign = 1;
for(int i = 0; i < s.length(); i++){
char c = s.charAt(i);
if(Character.isDigit(c)){
number = 10 * number + (int)(c - '0');
}else if(c == '+'){
result += sign * number;
number = 0;
sign = 1;
}else if(c == '-'){
result += sign * number;
number = 0;
sign = -1;
}else if(c == '('){
//we push the result first, then sign;
stack.push(result);
stack.push(sign);
//reset the sign and result for the value in the parenthesis
sign = 1;
result = 0;
}else if(c == ')'){
result += sign * number;
number = 0;
result *= stack.pop(); //stack.pop() is the sign before the parenthesis
result += stack.pop(); //stack.pop() now is the result calculated before the parenthesis
}
}
if(number != 0) result += sign * number;
return result;
}
四、不足
很多java的工具根本不知道……
Java Character:http://www.runoob.com/java/java-character.html
五、碎碎念
后天上午就要面试了,加油吖~