計算器核心算法
實現(xiàn)加法運算
2 + 5 + 6
上面是一個簡單的等式,我們的任務(wù)就是能計算出它的結(jié)果,我們用js提供的字符串方法對字符串進行處理。
在這里我參考w3c的文檔
var?str?=?"2+5+6";//?現(xiàn)在這里邊只有加法運算,我們需要把數(shù)字和符號區(qū)分開。//?我們獲取到字符串中?‘+’?首次出現(xiàn)的索引位置//?我們用?substring()?方法提取字符串function?parse?(var?str)?{ ??var?index?=?str.indexOf('+'); ??if?(index?!=?-1)?{ ????return?parse(str.substring(0,?index))?+?parse(str.substring(index?+?1)); ??} ??return?str?+?0;}//?我們?nèi)绾伟炎址D(zhuǎn)化為數(shù)字的,我們沒有用?js?提供的方法,//?而是使用字符串加數(shù)字0的方法巧妙的把字符串轉(zhuǎn)化為數(shù)字//?可以看到,parse?對加號前后進行了拆分,然后遞歸調(diào)用,//?把拆出來到字符串轉(zhuǎn)化為數(shù)字,這樣就實現(xiàn)了?'2?+?5?+?6'?的加法運算
大家好好理解一下,雖說代碼就幾句,但是里面意義還得靠大家自己仔細研究研究。好了話不多說,我們接下去分析
實現(xiàn)減法運算
同樣的道理,我們可以實現(xiàn)減法運算
function?parse?(var?str)?{ ??var?index?=?str.indexOf('+'); ??if?(index?!=?-1)?{ ????return?parse(str.substring(0,?index))?+?parse(str.substring(index?+?1)); ??} ??var?index?=?str.lastIndexOf('-'); ??if?(index?!=?-1)?{ ????return?parse(str.substring(0,?index))?+?parse(str.substring(index?+?1)); ??} ??return?str?+?0;}//?為什么我們在做減法運算時要使用?lastIndexOf()?呢?因為最后一個減號前后的等式先計算是不影響結(jié)果的//?假如一個等式?‘8-2-6’?答案是0大家都是知道的,如果你弄成?‘8’?-?‘2?-?6’?這就完全不一樣了,//?這個值就變成了?8?-?(?-?4?)??=?8?+?4?=?12//?但是你按照最后一個減號前后拆分?‘8?-?2’?-?‘6’??=?‘6’?-?‘6’?=?0答案是正確的!//?所以就是這里不一樣,其他還是和加號一樣是自己調(diào)用自己,如此已經(jīng)實現(xiàn)了連加連減的混合運算啦
實現(xiàn)乘除運算
所以我們繼續(xù)實現(xiàn)對乘號和除號的判斷,我就不解釋了,直接上代碼了
function?parse?(var?str)?{ ??var?index?=?str.indexOf('+'); ??if?(index?!=?-1)?{ ????return?parse(str.substring(0,?index))?+?parse(str.substring(index?+?1)); ??} ??var?index?=?str.lastIndexOf('-'); ??if?(index?!=?-1)?{ ????return?parse(str.substring(0,?index))?+?parse(str.substring(index?+?1)); ??} ??var?index?=?str.indexOf('*'); ??if?(index?!=?-1)?{ ????return?parse(str.substring(0,?index))?*?parse(str.substring(index?+?1)); ??} ??var?index?=?str.lastIndexOf('/'); ??if?(index?!=?-1)?{ ????return?parse(str.substring(0,?index))?/?parse(str.substring(index?+?1)); ???} ???return?str?+?0;}
實現(xiàn)括號運算
接下來重頭戲就來了,我們實現(xiàn)了沒有括號的混合運算,現(xiàn)在我們需要解決混合運算的等式中有多重的括號的等式,小學(xué)二年級我們學(xué)過先乘除后加減有括號先算括號里的,那我們怎么做呢?
冰狗~我們要算括號,那就是首先判斷括號,并且先把括號里邊的式子計算粗來,然后再算加減乘除。
其實吧,你要實現(xiàn)有多層括號的,比如"23+5(2+3*3)" 比如這樣子的等式,括號里面的等式需要優(yōu)先計算這是常識,你會發(fā)現(xiàn)在這個等式中,其實括號中的字符串 "2+3+3"你是能計算的,這就是上一篇講解的,其實無非你就是把括號里面的沒有括號的等式先計算出來
說白了就是把"(2+3*3)"替換成"11" 思路明白了吧?就是把最里面的一對括號里面的內(nèi)容先計算,然后計算結(jié)果替換那對括號。奧里給,造就完了。
找到最里面的一對括號
為什么要找到最里面的一對括號呢,原先我們能計算除了括號的混合運算,現(xiàn)在加了括號,原先的parse方法又不認識了,parse方法只認識沒有括號的,所以這里你要做的工作就是找到括號,然后計算括號里面的字符串,然后替換括號的位置
找到最里面的那一對括號 "(2+6-(22+1)) + (22+5)" 對于這個字符串最里面的括號就是"(2*2+1)" 因為這對括號里面已經(jīng)沒有括號了,所以我們找的就是這樣子的括號
計算括號里面的字符串,然后完成替換
//?我們想到了什么?我們可以使用?lastIndexOf()?和?indexOf()?找出最后一個?'('?和?第一個?')'function?parse?(var?str)?{ ??//?找到左括號 ??var?startIndex?=?str.lastIndexOf('(');??if?(startIndex?!=?-1)?{ ?????//?找到右括號 ????var?endIndex?=?str.indexOf(')',?startIndex); ????if?(endIndex?!=?-1)?{ ??????//?計算出括號中的值 ??????var?result?=?parse(str.substring(startIndex?+?1,?endIndex)); ??????//?拼接字符串,遞歸計算 ??????return?parse(str.substring(0,?startIndex)?+?result?+?str.substring(endIndex?+?1)); ????} ??} ??return?str?+?0;}
在parse方法的最前面加了一層判斷,也就是代碼如果走到這個判斷下面了,就代表這個等式已經(jīng)沒有括號了,因為有括號就在if語句里面直接返回了.....最后結(jié)果duang的一下就出來,這是特技!請不要相信!!!
就醬紫我們就把結(jié)果算出來了,基本上完成了計算器的核心算法,如果你喜歡就請關(guān)注我吧~謝啦!!☆⌒(*^-゜)v
完整源碼需要請自取
function?parse?(var?str)?{ ??//?找到左括號 ??var?startIndex?=?str.lastIndexOf('(');??if?(startIndex?!=?-1)?{ ?????//?找到右括號 ????var?endIndex?=?str.indexOf(')',?startIndex); ????if?(endIndex?!=?-1)?{ ??????//?計算出括號中的值 ??????var?result?=?parse(str.substring(startIndex?+?1,?endIndex)); ??????//?拼接字符串,遞歸計算 ??????return?parse(str.substring(0,?startIndex)?+?result?+?str.substring(endIndex?+?1)); ????} ??} ??var?index?=?str.indexOf('+'); ??if?(index?!=?-1)?{ ????return?parse(str.substring(0,?index))?+?parse(str.substring(index?+?1)); ??} ??var?index?=?str.lastIndexOf('-'); ??if?(index?!=?-1)?{ ????return?parse(str.substring(0,?index))?+?parse(str.substring(index?+?1)); ??} ??var?index?=?str.indexOf('*'); ??if?(index?!=?-1)?{ ????return?parse(str.substring(0,?index))?*?parse(str.substring(index?+?1)); ??} ??var?index?=?str.lastIndexOf('/'); ??if?(index?!=?-1)?{ ????return?parse(str.substring(0,?index))?/?parse(str.substring(index?+?1)); ???} ??return?str?+?0;}
數(shù)據(jù)結(jié)構(gòu) javaScript
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。