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
思路:有两个栈,一个栈为数字栈存放数和‘(’,另一个栈为符号栈存放符号
从字符串第一位开始判断,
如果为空,则跳过
如果为‘+’、‘-’压入符号栈
如果为‘)’,则从数字栈中取出一个数字,并且弹出‘(’,进行判断
如果为数字则循环直到符号或空格找到所有数字,
如果当前数字栈为空或者最上层为‘(’则直接压入数字栈
否则说明可以进行运算,则从符号栈中取出一个符号,从数字栈中取出一个数字,进行计算后放入数字栈
最后结果虽然AC,但是时间并不理想
public class Solution {
public int calculate(String s) {
Stack<String> numberStack=new Stack<String>();
Stack<Character> signStack=new Stack<Character>();
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
if(c!=' '){
if(c=='('){
numberStack.push(String.valueOf(c));
}else if(c==')'){
String aa=numberStack.pop();
numberStack.pop();
if(numberStack.isEmpty()||numberStack.peek().equals("(")){
numberStack.push(aa);
}else{
int b=Integer.valueOf(numberStack.pop());
int a=Integer.valueOf(aa);
char sign=signStack.pop();
if(sign=='+'){
String re=String.valueOf(b+a);
numberStack.push(re);
}else{
String re=String.valueOf(b-a);
numberStack.push(re);
}
}
}else if(c=='+'||c=='-'){
signStack.push(c);
}else{
String ss="";
int index=i;
while(index<s.length()&&s.charAt(index)>='0'&&s.charAt(index)<='9'){
ss+=s.charAt(index);
index++;
}
i=index-1;
//System.out.println(ss);
//System.out.println(numberStack);
if(numberStack.isEmpty()||numberStack.peek().equals("(")){
numberStack.push(ss);
}else{
int b=Integer.valueOf(numberStack.pop());
int a=Integer.valueOf(ss);
char sign=signStack.pop();
if(sign=='+'){
String re=String.valueOf(b+a);
numberStack.push(re);
}else{
String re=String.valueOf(b-a);
numberStack.push(re);
}
}
}
}
}
return Integer.valueOf(numberStack.pop());
}
}