和同事大哥一起研究出來(lái)的方法,記錄一下
并沒(méi)有使用逆波蘭方法,將中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式,再用棧計(jì)算。
這里使用的是不同運(yùn)算符號(hào)的優(yōu)先級(jí)來(lái)將表達(dá)式來(lái)拆分,于人計(jì)算的過(guò)程相似
如:((2+3)*4)-5
1.將表達(dá)式存入list a中,循環(huán)尋找是否含有“(”,如果沒(méi)有進(jìn)行按*/ +-的運(yùn)算規(guī)則將list? 循??? 環(huán)查找符號(hào),將list(i-1)*/ +-list(i+1)
??? 將式子遞歸通過(guò)循環(huán)來(lái)找尋“()”
??? 然后中不再有“()”括號(hào)的最小式子存入一個(gè)list b中
?? “(2+3)”//2級(jí)
2.將最小式子中按*/ +-的運(yùn)算規(guī)則將list循環(huán)查找符號(hào),將list(i-1)*/ +-list(i+1)將計(jì)算結(jié)果替換到list b中 ,直至乜有符號(hào)
??? 將結(jié)果替換到list a 中
3. 現(xiàn)在list 的表達(dá)式為 “(5*4)-5” 再次遞歸尋找含有括號(hào)的
```
import?java.text.DecimalFormat;
import?java.util.*;
public?class?Main?{
public?static?void?main(String[]?args)?{
Scanner?sc?=?new?Scanner(
System.in);
String?str?=?sc.nextLine();
char[]?chars?=?str.toCharArray();
/*1?:先將字符串變成數(shù)字和運(yùn)算符*/
List?list?=?new?ArrayList();
Stack?stack?=?new?Stack<>();
for?(int?i?=?0;?i?<?chars.length;?i++)?{
if?(chars[i]>='0'?&&?chars[i]<='9'){
int?num?=?chars[i]-'0';
int?j?=?0;
while?((i+1)='0'?&&?chars[i+1]<='9'??){
num?=?num*10+chars[i+1]-'0';
i++;
}
stack.push(num);
list.add(num+"");
}else{
stack.push(chars[i]);
list.add(chars[i]+"");
}
}
double?doublenum?=?getlsitlevel2(list);
System.out.println(doublenum);
}
/*0級(jí)*/
public?static?double?getlsitlevel0(?List?list?)?{
double?datevalue1?=?0?;
for?(int?i?=?0;?i?<?list.size();?i++)?{
if(?("+").equals(list.get(i))?){
datevalue1?=?datevalue1+?Double.parseDouble((String)?list.get(i+1));
i++;
}else?if(("-").equals(list.get(i))){
datevalue1?=?datevalue1-??Double.parseDouble((String)?list.get(i+1));
i++;
}else{
datevalue1?=?Double.parseDouble(?(String)list.get(i)?);
}
}
return?datevalue1;
}
/*1級(jí)*/
public?static?double?getlsitlevel1(?List?list?)?{
for?(int?i?=?0;?i?<?list.size();?i++)?{
if(?("*").equals(list.get(i))){
list.set(i-1,Double.parseDouble((String)?list.get(i-1))??*??Double.parseDouble((String)?list.get(i+1))+""?)??;
list.remove(i);
list.remove(i);
}else?if(?("/").equals(list.get(i))){
list.set(i-1,Double.parseDouble((String)?list.get(i-1))??/??Double.parseDouble((String)?list.get(i+1)?)+""?)???;
list.remove(i);
list.remove(i);
}
}
return?getlsitlevel0(list);
}
/*2級(jí)*/
public?static?double?getlsitlevel2(?List?list?)?{
if(islevel0(list)){
return?getlsitlevel1(list);
}
for?(int?i?=?0;?i?<?list.size();?i++)?{
int?yi?=?i;
if(?list.get(i).equals("(")?){
List?newlist?=?new?ArrayList<>();
i++;
int?leftnum?=?1;
while(i
if(?list.get(i).equals("(")){
leftnum?++;
newlist.add(?list.get(i));
}else?if(?list.get(i).equals(")"))?{
--leftnum;
if(leftnum==0){
break;
}else{
newlist.add(?list.get(i));
}
}else{
newlist.add(?list.get(i));
}
i++;
}
double?doublen?=?0;
if(islevel0(newlist)){
doublen?=?getlsitlevel1(newlist);
}else{
doublen?=?getlsitlevel2(newlist);
}
list.set(yi,doublen+"");
for?(int?j?=?yi+1;?j?
list.remove(yi+1);
}
i=yi+1;
}
}
return?getDoubleString(getlsitlevel2(list));
}
public?static?double?getDoubleString(double?number)?{
double?numberStr?=?0;
if?(((int)?number?*?1000)?==?(int)?(number?*?1000))?{
//如果是一個(gè)整數(shù)
numberStr?=?(int)?number;
}else{
return?number;
}
return?numberStr?;
}
public?static?boolean?islevel0(?List?list?)?{
for?(int?i?=?0;?i?<?list.size();?i++)?{
if(?list.get(i).equals("(")||list.get(i).equals(")")??){
return?false;
}
}
return?true;
}
```