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.
Example 1:
Input: "3+2*2"
Output: 7
Example 2:
Input: " 3/2 "
Output: 1
Example 3:
Input: " 3+5 / 2 "
Output: 5
Note:
You may assume that the given expression is always valid.
Do not use the eval built-in library function.
这个题和basic calculator 不同在于没有括号而增加了乘法和除法运算.难度相比basic calculator低一点.计算的过程和思路在解答的注释过程中.时间复杂度为Θ(n).
public static int calculateII(String s) {
/*
* 思路:遍历每一个符号,遇到+,-就记录下来,并把上一个+,-的数计算到结果之中,
* 遇到*,/也记录下来,并把上一个*,/的数计算到xnumber之中.
*/
int sum = 0;
int flag = 0;//0表示正1表示负
int xflag = 0;//0表示*1表示/
int number = 0;
int xnumber = 1;
s="0+"+s+"+";//因为延迟了一个运算符的特殊处理
for(int i = 0; i < s.length();i++){
char ch = s.charAt(i);
switch(ch){
case '+':
if(flag==0&&xflag==0)//+ *
sum+=(xnumber*number);
else if(flag==0&&xflag==1)//+ /
sum+=(xnumber/number);
else if(flag==1&&xflag==0)// - *
sum-=(xnumber*number);
else // - /
sum-=(xnumber/number);
number = 0;
flag = 0;
xflag = 0;//0表示*1表示/
xnumber = 1;
break;
case '-':
if(flag==0&&xflag==0)//+ *
sum+=(xnumber*number);
else if(flag==0&&xflag==1)//+ /
sum+=(xnumber/number);
else if(flag==1&&xflag==0)// - *
sum-=(xnumber*number);
else // - /
sum-=(xnumber/number);
number = 0;
xflag = 0;//0表示*1表示/
xnumber = 1;
number = 0;
flag = 1;
break;
case '*':
if(xnumber==1){//乘法运算第一个因子
xnumber*=number;
}else{//延迟运算符号处理
if(xflag == 0)xnumber *= number;
else xnumber /= number;
}
xflag = 0;
break;
case '/':
if(xnumber==1)//除法运算被除数
xnumber = number;
else{//延迟运算符号处理
if(xflag == 0)xnumber *= number;
else xnumber /= number;
}
xflag = 1;
break;
case ' ': //空格不处理
break;
default: //连续数字的处理
String str = "";
while(ch>='0'&&ch<='9'){
str = str + ch;
if(i+1>=s.length())break;
ch=s.charAt(++i);
}
number = Integer.valueOf(str);
i--;
}
}
return sum;
}