計算器核心算法

      網(wǎng)友投稿 745 2025-04-01

      實現(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)容。

      上一篇:我們熱愛云ERP軟件的8個理由
      下一篇:wps默認行間距是多少
      相關(guān)文章
      国产成人亚洲精品电影| 亚洲影院天堂中文av色| 久久久久久亚洲av无码蜜芽| 亚洲国产情侣一区二区三区| 噜噜噜亚洲色成人网站∨| 亚洲成人动漫在线| 亚洲AV无码专区电影在线观看| 亚洲中文字幕日产乱码高清app| 亚洲国产成人久久综合野外| jzzijzzij在线观看亚洲熟妇| 亚洲精品中文字幕| 久久久久亚洲AV无码去区首| 亚洲国产成人手机在线观看 | 亚洲香蕉久久一区二区三区四区| 亚洲福利秒拍一区二区| 亚洲精品免费在线| 亚洲国产超清无码专区| 亚洲成aⅴ人在线观看| 亚洲一级大黄大色毛片| 亚洲午夜一区二区三区| 在线亚洲午夜片AV大片| 亚洲精品无码久久久久A片苍井空 亚洲精品无码久久久久YW | 亚洲中文字幕无码日韩| 亚洲熟妇无码另类久久久| 亚洲成色www久久网站夜月| 亚洲成AV人片在线观看无| 亚洲乱亚洲乱淫久久| 亚洲综合色丁香麻豆| 亚洲国产人成在线观看| 国产午夜亚洲精品国产| 亚洲GV天堂无码男同在线观看| 亚洲av日韩av永久无码电影| 日产国产精品亚洲系列| 亚洲一本大道无码av天堂| 亚洲精品成人无限看| 久久久无码精品亚洲日韩按摩| 亚洲人成在线播放| 亚洲AV无码专区在线电影成人| 婷婷亚洲天堂影院| 亚洲午夜久久久久久噜噜噜| 久久国产精品亚洲一区二区|