算法 字符串的四則運(yùn)算

和同事大哥一起研究出來(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;

}

```

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容