题解 | #表达式求值#
表达式求值
http://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
算法思路如下:
从左往右依次遍历判断每个遇到的字符,如果是数字,则记录更新当前的数字,如果是运算符,则根据上一次的运算符将计算后的结果存入栈中,如果是左括号则代表遇到了子问题,递归调用函数,如果是右括号,break掉,进行栈内结果的计算。
代码如下:`
class Solution {
private int index = 0;
public int calculate(String s) {
char[] ch = s.toCharArray();
return cal(ch);
}
private int cal(char[] ch){
Deque<Integer> stack = new ArrayDeque<>();
int num = 0;
char sign = '+';
for(; index < ch.length; index++){
char c = ch[index];
if(Character.isDigit(c)){
num = num*10 + (c-'0');
}
if(c == '('){
index++;//index指针指到下一个字符
num = cal(ch);
}
//当遇到了新的运算符,就要对上一个运算符sign和累计的数字num作运算
//空格直接无视,i继续前进
//遇到字符串末尾,肯定是要结算的
if(!Character.isDigit(c)&& c != ' ' || index == ch.length-1){
int pre = 0;
switch(sign){
case '+':
stack.push(num);
break;
case '-':
stack.push(-num);
break;
case '*':
pre = stack.pop();
stack.push(pre * num);
break;
case '/':
pre = stack.pop();
stack.push(pre / num);
break;
}
sign = c;
num = 0;//计数归位
}
if(c == ')') break;//阶段,后面开始计算局部结果,返回
}
int res = 0;
while(!stack.isEmpty()){
res += stack.pop();
}
return res;
}
}
查看4道真题和解析