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.
思路:最开始想用逆波兰表达式,但是此题没有乘法和除法,写逆波兰就有点牛刀小用了。参考了大神们的思路,首先要能解析出不同位数的数字,有些数字只有个位,如:1、9,有些数字有十位、百位,如11、121。其次,当遇到左括号时,要把之前的计算结果和操作符保存起来,然后单独计算括号内的式子。最后,加号记为+1,减号记为-1。
参考了大神们的程序,写得很贼。
public static int calculate(String s) {
if(s == null) return 0;
int len = s.length();
int num = 0; //计算的中间值
int result = 0; // 最终结果
int op = 1; // '+' 1, '-' -1
Stack<Integer> stack = new Stack<Integer>();
for(int i = 0; i < len; i++) {
char c = s.charAt(i);
switch(c) {
case ' ':
break;
case '+':
result += op * num; //先把result的值求出来
op = 1; //改变op
num = 0; // 计算完result后,num恢复为0
break;
case '-':
result += op * num;
op = -1;
num = 0;
break;
case '(':
stack.push(result); //保存result
stack.push(op); //保存op
// 单独计算括号内的式子,需要把result和op重置为默认状态
result = 0;
op = 1;
break;
case ')':
result += op * num;
num = result;
op = stack.pop(); //恢复之前op
result = stack.pop(); //恢复之前的result
break;
default:
num = num * 10 + c - '0'; //解析出数字
}
}
result += op * num;
return