题解 | #表达式求值#
表达式求值
http://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
public int solve (String s) {
// write code here
if(s == null || s.length() == 0){
return 0;
}
char[] data = s.toCharArray();
int n = data.length;
//默认是 + 号 第一个数字作为 + a
char sign = '+';
//可能连续两个都是数字,只有遇到符号才重置
int number = 0;
Stack<Integer> stack = new Stack<>();
for(int i = 0;i< data.length;i++){
char item = data[i];
if(item == ' '){
continue;
}
if(item >= '0' && item <= '9'){
number = number * 10 +item - '0';
}
if(item == '('){
int brackets = 1;
int j = i+1;
while(brackets >0){
if(data[j] == '('){
brackets ++;
}else if(data[j] == ')'){
brackets --;
}
j++;
}
//while条件终止时 j多加了1
//扩号里的 数 就是 i+1 到 j - 1
number = solve(s.substring(i+1,j-1));
//扩号里的求解完了 从 ) 后开始 让 i++循环
i = j - 1;
}
if( item < '0' || item >'9' || i == n - 1){
if(sign == '+'){
stack.push(number);
}else if(sign == '-'){
stack.push( -1 *number);
}else if(sign == '/'){
stack.push(stack.pop()/number);
}else if(sign == '*'){
stack.push(stack.pop() * number);
}
// 下个数字或者表达式前的符号
sign = item;
number = 0 ;
}
}
int ans = 0;
while(!stack.isEmpty()){
ans += stack.pop();
}
return ans;
}
}