需求:
邊輸入數(shù)據(jù),邊得到計算值凳枝。
比如String = "1+2*3+4";
輸出:1 3 7 11
Java代碼實(shí)現(xiàn):
@Test
public void testAdd() {
//測試數(shù)據(jù)
? ? String str ="1+3+12*22";
char[] chars = str.toCharArray();
//記錄前數(shù)據(jù)
? ? StringBuffer sb1 =new StringBuffer();
//記錄后數(shù)據(jù)
? ? StringBuffer sb2 =new StringBuffer();
Integer result =0;
//保存乘號前面的值
? ? Integer iniSb =0;
//相乘值
? ? Integer cenNum;
//保存相乘值結(jié)果
? ? Integer iniCen;
//運(yùn)算符號標(biāo)識
? ? boolean flag =true;
for (int i =0; i < chars.length; i++) {
if (chars[i] >='0' && chars[i] <='9') {
if (flag) {
if (sb1.length() >0) {
//如果前面有數(shù)據(jù)則先減去
? ? ? ? ? ? ? ? ? ? result -= Integer.parseInt(sb1.toString());
}
sb1.append(chars[i]);
result += Integer.parseInt(sb1.toString());
}else {
if (sb2.length() >0) {
//如果前面有數(shù)據(jù)則先減去
? ? ? ? ? ? ? ? ? ? result -= (iniSb * Integer.parseInt(sb2.toString()));
}
sb2.append(chars[i]);
if (sb2.length() >1) {
//將sb1恢復(fù)初始值
? ? ? ? ? ? ? ? ? ? sb1.setLength(0);
sb1.append(iniSb);
}
if (sb1.length() >0 && sb2.length() >0) {
cenNum = Integer.parseInt(sb1.toString());
//中間值
? ? ? ? ? ? ? ? ? ? iniCen= cenNum * Integer.parseInt(sb2.toString());
sb1.setLength(0);
sb1.append(iniCen);
result += iniCen;
}
}
System.out.println(result);
}else if (chars[i] =='+') {
flag =true;
sb1.setLength(0);
sb2.setLength(0);
}else if (chars[i] =='*') {
//改變標(biāo)識狀態(tài)
? ? ? ? ? ? flag =false;
//初始化乘號前面的值
? ? ? ? ? ? iniSb = Integer.parseInt(sb1.toString());
//初始化稱號后面的值
? ? ? ? ? ? sb2.setLength(0);
//將值改為未進(jìn)行乘號運(yùn)算時的值
? ? ? ? ? ? result -= iniSb;
}else {
continue;
}
}
}
本方法只計算加法和乘法竖共,也可進(jìn)行計算贸人。
程序測試:
String str = "1*22*33";
輸出結(jié)果:
程序測試:
String str = "11*22*33";
輸出結(jié)果:
程序測試:
String str = "11+22+33";
輸出結(jié)果:
程序測試:
String str = "21+12*13*15+16";
輸出結(jié)果:
以上是測試結(jié)果唾琼,保證輸入是合法的团秽,如果程序有bug走触,歡迎指正晦譬。