Implement a basic calculator to evaluate a simple expression string.
The expression string contains only non-negative integers, +
, -
, *
, /
operators and empty spaces . The integer division should truncate toward zero.
You may assume that the given expression is always valid.
Some examples:
"3+2*2" = 7 " 3/2 " = 1 " 3+5 / 2 " = 5
Note: Do not use the eval
built-in library function.
第一遍做用的是递归来做,有些复杂,当运算的数很多时会报java.lang.StackOverflowError的错误!
这里有个容易忽略的点例如"1-2+3",这样下一步得到的"-1+3"会以负号开头,所以要小心。
public class Solution {
public int calculate(String s) {
String str=s.replace(" ", "");
return calculateStr(str);
}
public int calculateStr(String str) {
// TODO Auto-generated method stub
boolean negtiveStart=false;
if(str.charAt(0)=='-'){
negtiveStart=true;
}
int left;
if(isDigit(str))
return Integer.parseInt(str);
int idx=1;
while(str.charAt(idx)>='0'&&str.charAt(idx)<='9'){
idx++;
}
if(negtiveStart){
str=str.substring(0);
}
left=Integer.parseInt(str.substring(0, idx));
if(str.charAt(idx)=='+'){
int right=calculateStr(str.substring(idx+1));
return left+right;
}
if(str.charAt(idx)=='-'){
String rightStr=str.substring(idx+1);
if(isDigit(rightStr)){
int right=Integer.parseInt(str.substring(idx+1));
return left-right;
}else{
int nextIdx=idx+1;
while(str.charAt(nextIdx)>='0'&&str.charAt(nextIdx)<='9'){
nextIdx++;
}
int right=Integer.parseInt(str.substring(idx+1, nextIdx));
return calculateStr(left-right+str.substring(nextIdx));
}
}
if(str.charAt(idx)=='*'){
String rightStr=str.substring(idx+1);
if(isDigit(rightStr)){
int right=Integer.parseInt(str.substring(idx+1));
return left*right;
}else{
int nextIdx=idx+1;
while(str.charAt(nextIdx)>='0'&&str.charAt(nextIdx)<='9'){
nextIdx++;
}
int right=Integer.parseInt(str.substring(idx+1, nextIdx));
return calculateStr(left*right+str.substring(nextIdx));
}
}
if(str.charAt(idx)=='/'){
String rightStr=str.substring(idx+1);
if(isDigit(rightStr)){
int right=Integer.parseInt(str.substring(idx+1));
return left/right;
}else{
int nextIdx=idx+1;
while(str.charAt(nextIdx)>='0'&&str.charAt(nextIdx)<='9'){
nextIdx++;
}
int right=Integer.parseInt(str.substring(idx+1, nextIdx));
return calculateStr(left/right+str.substring(nextIdx));
}
}
return 0;
}
public boolean isDigit(String str) {
// TODO Auto-generated method stub
int idx=0;
while(idx<str.length()&&str.charAt(idx)>='0'&&str.charAt(idx)<='9'){
idx++;
}
if(idx==str.length()){
return true;
}
return false;
}
}
这个题应该用栈来解决:
public class Solution {
public int calculate(String s) {
if(s==null || s.length()==0) return 0;
LinkedList<Integer> list = new LinkedList<Integer>();
for(int i=0; i<s.length(); i++) {
char c = s.charAt(i);
if(Character.isDigit(c)) {
int cur = c-'0';
while(i+1<s.length() && Character.isDigit(s.charAt(i+1))) {
cur = cur * 10 + s.charAt(i+1) - '0';
++i;
}
if(!list.isEmpty() && (list.peek() == 2 || list.peek()==3)) {
int op = list.pop();
int opl = list.pop();
int res = 0;
if(op==2) res = opl * cur;
else res = opl / cur;
list.push(res);
} else {
list.push(cur);
}
} else if(c==' ') continue;
else {
switch (c) {
case '+': list.push(0);
break;
case '-': list.push(1);
break;
case '*': list.push(2);
break;
case '/': list.push(3);
break;
default: return -1;
}
}
}
if(list.isEmpty()) return 0;
Collections.reverse(list);
int res = list.poll();
while(!list.isEmpty()) {
int op = list.poll();
int opr = list.poll();
if(op==0) res += opr;
else res -= opr;
}
return res;
}
}