說到加減乘除運算,隻要學過乘法口訣的應該沒有不會算的吧。
什麼一一得一,一二得二.。。。信手拈來,簡直不要太容易。
難一點的無非也就是這四種運算符号組合起來而已,但是如此簡單的運算對于計算機而言,真的不是一件輕松的活啊。
就運算速度上,計算機遠超你我。
就運算簡易程度而言,你我勝過計算機。
為什麼這麼說呢?
下面舉個栗子,求一個算式(也叫中綴表達式)結果:5 (6-3)*4 8/2=?
對于我們而言,這個算式輕松的得到答案是21。那麼計算機,又是如何得出這個結果的呢?
談到這個問題,首先我們應該了解兩個知識:棧(stack)和後綴表達式。
什麼是棧?
棧又名堆棧,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和删除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧删除元素又稱作出棧或退棧,它是把棧頂元素删除掉,使其相鄰的元素成為新的棧頂元素。
首先介紹轉換為後綴表達式的過程。轉換的過程中遵循一個規則(符号進棧,數字輸出):
從左到右遍曆中綴表達式的每個數字和符号
如果是數字就加入後綴表達式
如果是符号,判斷括号:如果是左括号“(”,直接入棧;是右括号“)”,則依次從棧中取出運算符加入後綴表達式中,直至取到“(”後停止,并且将棧中“(”删除
如果是括号以外的其他運算符,判斷這個運算符和棧頂符号優先級:其優先級低于或者等于棧頂符号則先将棧中符号依次彈出加入後綴表達式後自身入棧,否則自身就直接入棧
直到遍曆中綴表達式結束,得到後綴表達式
詳細過程:
将5輸出, 進棧; 目前輸出為5,棧中為 ;
遇到(,進棧; 目前輸出為5,棧底到棧頂依次為 (;
将6輸出,減号進棧,3輸出; 目前輸出為5 6 3,棧底到棧頂依次為 (-;
遇到),去匹配(,棧頂符号出棧,直到(出棧; 目前輸出為5 6 3-,棧中為 ;
遇到乘号進棧,6輸出;目前輸出為5 6 3 - 4,棧底到棧頂依次為 *;
遇到 ,由于 的優先級比*低,所以棧中所有元素都出棧,自身進棧; 目前輸出為5 6 3 - 4 * ,棧底到棧頂依次為 ;
遇到10輸出,除号進棧;目前輸出為5 6 3 - 4 * 8,棧底到棧頂依次為 /;
遇到2輸出;目前輸出為5 6 3 - 4 * 8 2,棧底到棧頂依次為 /;
表達式結束,棧中全部依次出棧,最終為5 6 3 - 4 * 8 2 / ;
其次是後綴表達式的執行過程。其執行過程也遵循一個規則:
從左向右遍曆後綴表達式的每個數字和符号,
遇到是數字就進棧
遇到是符号,就将處于棧頂兩個數字出棧,三者進行運算得到的運算結果進棧, 直到最後獲得運算結果
5 6 3 依次進棧,然後遇到了減号;此時棧底到棧頂依次為5 6 3;
處于棧頂的3和6出棧,相減得到3,将3進棧;此時棧底到棧頂依次為5 3;
4進棧,然後遇到乘号;此時棧底到棧頂依次為5 3 4;
處于棧頂的4和3出棧,相乘得到12,将12進棧;此時棧底到棧頂依次為5 12;
遇到加号,處于棧頂的12和5出棧,加一下得到17,将17進棧;此時棧裡隻有一個17;
8 2依次進棧,然後遇到除号;此時棧底到棧頂依次為17 8 2;
處于棧頂的2和8出棧,相除得到4,将4進棧;此時棧底到棧頂依次為17 4;
遇到加号,處于棧頂的4和17出棧,想加得到21,将21進棧;
表達式結束,輸出結果21,棧變空。
看完感覺怎樣?
是不是很複雜?
其實還好吧,233。。。
有的小夥伴可能又要吐槽了,知道這些過程有個屁用,實際工作中會讓你寫這個過程麼?
是的,工作可能不需要你了解底層如何計算,你需要告訴計算機這些數字和運算符,剩下的就等着拿到結果就ok。
我想說,編程重要的不是你能不能完成單純的開發任務,而是你能不能從任務中看到背後的編程思想。
思想決定高度!
思想有多遠,你就能走多遠~~~~~~~~
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!