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.
计算器问题,两个栈分别存储操作数和操作符,操作符存储+ -和(,当遇到)向前回溯计算直至第一个(,代表计算完毕一个括号,当栈顶元素为+或-时代表需要进行计算,代码:
public int calculate(String s) { int i=0; Stack<Character> op=new Stack<>(); Stack<Integer> num=new Stack<>(); while(i<s.length()){ while(s.charAt(i)==' '){ i++; } if(s.charAt(i)=='+'||s.charAt(i)=='-'||s.charAt(i)=='('){ op.push(s.charAt(i)); i++; } else if(s.charAt(i)==')'){ while(op.peek()!='('){ char temp=op.pop(); int num1=num.pop(); int num2=num.pop(); if(temp=='+'){ num.push(num1+num2); } else if(temp=='-') num.push(num2-num1); } op.pop(); while(!op.isEmpty()&&op.peek()!='('){ char temp=op.pop(); int num1=num.pop(); int num2=num.pop(); if(temp=='+'){ num.push(num1+num2); } else if(temp=='-') num.push(num2-num1); } i++; } else{ int k=0; while(i<s.length()&&s.charAt(i)>='0'&&s.charAt(i)<='9'){ k=k*10+(s.charAt(i)-'0'); i++; } if(!op.isEmpty()&&op.peek()=='+'){ op.pop(); int temp=num.pop(); num.push(temp+k); } else if(!op.isEmpty()&&op.peek()=='-'){ op.pop(); num.push(num.pop()-k); } else num.push(k); } } return num.peek(); }