题解 | #表达式求值#
表达式求值
http://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
ref: https://blog.nowcoder.net/n/65fcad0be1a543359effef1228ae5d2e
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
public int solve (String s) {
// write code here
s = s.trim();
// 用栈保存各部分计算的和
Stack<Integer> stack=new Stack<>();
int sum=0,number=0;// 使用 number 变量记录字符串中的数字部分的数字值是多少
// 使用 sign 变量记录运算符(前面的)
char sign='+';
char[] cs=s.toCharArray();
for(int i=0;i<cs.length;i++){
char c=cs[i];
//遇到左括号时递归求这个括号里面的表达式的值
//先遍历找到对应的右括号,因为可能里面还嵌有多对括号,
//使用一个变量 counterPartition 统计括号对数直到变量为 0
if(c=='('){
int j=i+1;
int cntPar=1;
while(cntPar>0){
if(cs[j]=='('){
cntPar++;
}
if(cs[j]==')'){
cntPar--;
}
j++;
}
// (3-4)
// i j
number=solve(s.substring(i+1,j-1));
i=j-1;
}
// 遇到数字时继续遍历求这个完整的数字的值,保存到 number 中
if(Character.isDigit(c)){
number=number*10+c-'0';
}
// 遇到运算符时或者到表达式末尾时,就去计算上一个运算符
// 并把计算结果 push 进栈,然后保存新的运算符到 sign
if(!Character.isDigit(c)||i==cs.length-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);
}
number=0;
sign=c;
}
}
// 最后把栈中的结果求和即可
while(!stack.isEmpty()){
sum+=stack.pop();
}
return sum;
}
}
韶音科技公司氛围 643人发布