public static int getValue(String str) {
return value(str.toCharArray(),0)[0];
}
//back[0]返回的是计算结果
//back[1]返回的计算到的位置
public static int [] value(char [] str,int i) {
LinkedList<String>que=new LinkedList<String>();
int pre=0;
int [] back=null;
//当i未到终点并且没有遇到右括号
while(i<str.length && str[i]!=')') {
if(str[i]>='0'&&str[i]<='9') {
pre=pre*10+str[i++]-'0';
}
//说明遇到了加减乘除
else if(str[i]!='(') {
//子程序去处理加减乘除
//如果是+-直接添加,乘除运算后添加到链表
addNum(que,pre);
//把符号放入链表中
que.addLast(String.valueOf(str[i++]));
//清空pre用来接收下次的值
pre=0;
}
//遇到了(
else {
//开始递归,从i+1的位置开始
back=value(str,i+1);
pre=back[0];
i=back[1]+1;
}
}
//将最后一个数加入到链表中
addNum(que,pre);
//将剩下的+-求和
return new int[] {getNum(que),i};
}
public static void addNum(LinkedList<String>que,int num) {
if(!que.isEmpty()) {
int cur=0;
// 获取并移除此列表的最后一个元素;如果此列表为空,则返回 null
String top=que.pollLast();
//如果获得+-就将他们存入链表中
if(top.equals("+") || top.equals("-")){
que.addLast(top);
}
//如果获得*/就将它们的结果计算出来,再添加回链表末尾
else {
//返回保存指定的 String 的值的 Integer 对象。
cur=Integer.valueOf(que.pollLast());
num=top.equals("*")?(cur*num):(cur/num);
}
}
//将指定元素添加到此列表的结尾
//返回 int参数的字符串表示形式
que.addLast(String.valueOf(num));
}
//计算到这一步式子中一定只有+-,求和
public static int getNum(LinkedList<String>que) {
int res=0;
boolean add=true;
String cur=null;
int num=0;
while(!que.isEmpty()) {
//弹出链表的头节点
cur=que.pollFirst();
if(cur.equals("+")) {
add=true;
}else if(cur.equals("-")) {
add=false;
}else {
num=Integer.valueOf(cur);
//add是true就+num,否则-num
res+=add?num:(-num);
}
}
return res;
}