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.
題目中只有+ - ( )税肪。遍歷字符串竞穷,對(duì)于每個(gè)字符c:
- 如果是數(shù)字,則一直遍歷到非數(shù)字字符芜飘,把數(shù)字找出恍风,并與結(jié)果相加
- 如果是+-符號(hào)蹦狂,將sign設(shè)置成對(duì)應(yīng)的值
- 如果是(,將rt和sign壓入棧中朋贬,重置rt和sign
- 如果是)凯楔,將sign和rt彈出棧,并計(jì)算結(jié)果
/**
* 計(jì)算帶括號(hào)的string的值
* @param s
* @return
*/
public int calculate(String s) {
if(s==null){
throw new IllegalArgumentException();
}
int res=0; //結(jié)果值
int flag=1; //記錄前面的符號(hào)锦募,加為1摆屯,減為-1
Stack<Integer> stack=new Stack<>();
for (int i=0;i<s.length();i++){
char c=s.charAt(i);
int val=0;
if(Character.isDigit(c)){
val=c-'0';
while (i+1<s.length() && Character.isDigit(s.charAt(i+1))){
val=val*10+s.charAt(++i)-'0';
}
res+=flag*val;
}
else if(c=='+'){
flag=1;
}else if(c=='-'){
flag=-1;
}else if(c=='('){
//遇到括號(hào)先壓棧結(jié)果,再壓棧符號(hào)
stack.push(res);
stack.push(flag);
res=0;
flag=1;
}else if(c==')'){
res=res*stack.pop()+stack.pop();
}
}
System.out.print(res);
return res;
}