Java計(jì)算器核心算法代碼實(shí)現(xiàn)
在進(jìn)行一個(gè)表達(dá)式的計(jì)算時(shí),先將表達(dá)式分割成數(shù)字和字符串然后利用出入棧將分割后的表達(dá)式進(jìn)行中綴轉(zhuǎn)后綴,再將后綴表達(dá)式進(jìn)行計(jì)算得到結(jié)果(思想在上一篇寫過)現(xiàn)在貼下Java語言的代碼實(shí)現(xiàn)。(學(xué)習(xí)Java時(shí)間不長(zhǎng)所以可能會(huì)有很多不足的地方,我會(huì)改進(jìn)也歡迎大神可以給我一些意見和建議~謝謝啦)
我將這部分分成三個(gè)方法完成功能,并在getResult方法調(diào)用(getResult方法被主方法調(diào)用)
private String getResult(String str) {
//分割
String[] Str = segment(str);
//中綴轉(zhuǎn)后綴
String newStr = infToSuf(Str);
//后綴計(jì)算
String result = sufToRes(newStr);
return sufToRes(result);
}
1.字符串分割,為避免在TextView上顯示帶空格刪除時(shí)不方便而且顯示屏就那么大占地方,錄入時(shí)的字符串中沒有空格然后就手動(dòng)分割了
private static String[] segment(String str) {
String[] exp = new String[str.length()+1];
//找最近的索引并截取字符串
int l = str.length();
for(int i = 0;i < l+1;i++) {
int index;
int[] ind = new int[6];
ind[0] = str.indexOf('+');
ind[1] = str.indexOf('-');
ind[2] = str.indexOf('*');
ind[3] = str.indexOf('/');
ind[4] = str.indexOf('(');
ind[5] = str.indexOf(')');
if(ind[1] == 0) {
Arrays.sort(ind);
int t;
for(t = 0;t <6;t++) {
if(ind[t] >= 0)
break;
}
int r = ind[t+1];
exp[i] = str.substring(0,r);
i++;
exp[i] = str.substring(r,r+1);
str = str.substring(r+1);
}else if(((ind[1]-ind[4]) == 1) && (ind[4]==0)) {
Arrays.sort(ind);
int t ;
for(t = 0;t <6;t++) {
if(ind[t] >= 0)
break;
}
int r = ind[t+1];
exp[i] = str.substring(0,1);
i++;
exp[i] = str.substring(1,r+2);
i++;
exp[i] = str.substring(r+2,r+3);
str = str.substring(r+3);
}else {
Arrays.sort(ind);
int t;
for(t = 0;t <6;t++) {
if(ind[t] >= 0)
break;
}
if(t==6)
break;
index = ind[t];
if(index!=0) {
exp[i] = str.substring(0,index);
i++;
}
exp[i] = str.substring(index,index+1);
str = str.substring(index+1);
}
}
int j = 0;
int k = 0;
for(; exp[j]!=null ;j++){}
if(!exp[j-1].equals(")")) {
exp[j]=str;
str = "";
k = j;
}else {
k = j-1;
}
String[] expp = new String[k+1];
for(int t = 0; t < k+1;t++) {
expp[t] = exp[t];
}
return expp;
//System.out.println("分割的字符串:");
}
2.中綴轉(zhuǎn)后綴
private static String infToSuf(String[] exp) {
String newStrs = "";
//初始化棧
Stack<String> stack = new Stack<>();
/*
判斷并放入后綴表達(dá)式中:
for循環(huán)遍歷整個(gè)str進(jìn)行判斷
循環(huán)結(jié)束若棧不為空全部出棧
*/
int l = exp.length;
for(int i = 0; i < l; i++) {
if ((stack.empty()) && (exp[i].equals("+") || exp[i].equals("-") || exp[i].equals("*") || exp[i].equals("/"))) {
stack.push(exp[i]);
} else if (exp[i].equals("(")) {
stack.push(exp[i]);
} else if (exp[i].equals("*") || exp[i].equals("/")) {
while (stack.peek().equals("*") || stack.peek().equals("/")) {
newStrs = newStrs.concat(stack.pop()+" ");
if(stack.isEmpty()) {
break;
}
}
stack.push(exp[i]);
} else if (exp[i].equals("+") || exp[i].equals("-")) {
while (!(stack.isEmpty())&&((stack.peek()).equals("*") || (stack.peek()).equals("/") || (stack.peek()).equals("+") || (stack.peek()).equals("-"))) {
newStrs = newStrs.concat(stack.pop()+" ");
if(stack.isEmpty()) {
break;
}
}
stack.push(exp[i]);
} else if (exp[i].equals(")")) {
int t = stack.search("(");
for (int k = 1; k < t; k++) {
newStrs = newStrs.concat(stack.pop()+" ");
}
String tstr = stack.pop();
} else {
newStrs = newStrs.concat(exp[i]+ " ");
}
}
while (!stack.empty()) {
if (!stack.peek().equals("(") || !stack.peek().equals(")")) {
newStrs = newStrs.concat(stack.pop()+" ");
} else if (stack.peek().equals("(") || stack.peek().equals(")")) {
String tstr = stack.pop();
}
}
// System.out.println("后綴:"+newStrs);
return newStrs;
}
3.后綴的計(jì)算
private static String sufToRes(String sufStr) {
String[] exp = sufStr.split(" ");
Stack<String> stack = new Stack<>();
String Res = "";
for(int i = 0;i < exp.length; i++) {
if(!exp[i].equals("+") && !exp[i].equals("-") && !exp[i].equals("*") && !exp[i].equals("/")){
stack.push(exp[i]);
}else if(exp[i].equals("+")) {
BigDecimal b2 = new BigDecimal(stack.pop());
BigDecimal b1 = new BigDecimal(stack.pop());
BigDecimal b3 = b1.add(b2);
stack.push(b3.toString());
}else if(exp[i].equals("-")) {
BigDecimal b2 = new BigDecimal(stack.pop());
BigDecimal b1 = new BigDecimal(stack.pop());
BigDecimal b3 = b1.subtract(b2);
stack.push(b3.toString());
}else if(exp[i].equals("*")) {
BigDecimal b2 = new BigDecimal(stack.pop());
BigDecimal b1 = new BigDecimal(stack.pop());
BigDecimal b3 = new BigDecimal(0);
if(b1.compareTo(BigDecimal.ZERO)== 0|| b2.compareTo(BigDecimal.ZERO) == 0) {
b3 = BigDecimal.ZERO;
}else {
b3 = b1.multiply(b2);
}
stack.push(b3.toString());
}else if(exp[i].equals("/")){
BigDecimal b2 = new BigDecimal(stack.pop());
BigDecimal b1 = new BigDecimal(stack.pop());
BigDecimal b3 = new BigDecimal(0);
double d1 = b1.doubleValue();
double d2 = b2.doubleValue();
if(d1%d2 == 0){
b3 = (b1.divide(b2));
stack.push(b3.toString());
}else {
b3 = b1.divide(b2,10, RoundingMode.HALF_UP);
stack.push(b3.toString());
}
}
}
Res = stack.pop();
boolean flag = false;
for (int m = 0; m < Res.length() - 1;m++) {
if(Res.charAt(m) == '.'){
flag = true;
}
}
if(flag) {
for(int m = Res.length()-1;m >= 0;m--) {
if(Res.charAt(m) == '0'){
}else {
Res = Res.substring(0,m+1);
break;
}
}
if(Res.charAt(Res.length()-1) == '.') {
Res = Res.substring(0,Res.length()-1);
}
}
return Res;
}
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
Java設(shè)計(jì)模式中的代理設(shè)計(jì)模式詳細(xì)解析
這篇文章主要介紹了Java設(shè)計(jì)模式中的代理設(shè)計(jì)模式詳細(xì)解析,代理模式,重要的在于代理二字,何為代理,我們可以聯(lián)想到生活中的例子,比如秘書、中介這類職業(yè),我們可以委托中介去幫我們完成某些事情,而我們自己只需要關(guān)注我們必須完成的事情,需要的朋友可以參考下2023-12-12
聊聊Spring?Boot如何配置多個(gè)Kafka數(shù)據(jù)源
這篇文章主要介紹了Spring?Boot配置多個(gè)Kafka數(shù)據(jù)源的相關(guān)知識(shí),包括生產(chǎn)者、消費(fèi)者配置,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-10-10
Java實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng)的實(shí)例代碼
這篇文章主要介紹了Java實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
解決idea每次打開新的項(xiàng)目都需要重新配置maven問題
這篇文章主要介紹了解決idea每次打開新的項(xiàng)目都需要重新配置maven問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
Java中如何取出String字符串括號(hào)中的內(nèi)容
這篇文章主要介紹了Java中如何取出String字符串括號(hào)中的內(nèi)容問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
Java使用抽象工廠模式實(shí)現(xiàn)的肯德基消費(fèi)案例詳解
這篇文章主要介紹了Java使用抽象工廠模式實(shí)現(xiàn)的肯德基消費(fèi)案例,較為詳細(xì)的分析了抽象工廠模式的定義、原理并結(jié)合實(shí)例形式分析了Java使用抽象工廠模式實(shí)現(xiàn)肯德基消費(fèi)案例的步驟與相關(guān)操作技巧,需要的朋友可以參考下2018-05-05

