日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

計算器制作JAVA版(第三步,表達式求值(+-*/))

系統 2326 0

這個東西一直是大家關注的熱點,也是這個題目的真正目標所在,希望大家能夠好好學習了解這個部分的思路想法。雖然這個思路不是以后編譯原理上面的標準思路,也不是什么正統方法,但是它確實符合大家的想法和一貫的思路。因為不夠正統和強悍,如有高人敬請指點。
那么我們來考慮一下這個表達式,如果只有加減運算符大家是否感覺能很好的解決呢?
首先是單位的數字和運算符(只有加減),那么我們就只用順序處理即可。形如:a+b-c+d,我們是如何計算的呢?首先計算a+b,然后將結果e替代a+b-->e-c+d-->h+d-->i一次一次計算替換的反復。如此以來我們就有了一個思路,拿出三個,計算結果丟進去,再拿出三個計算。我們假設,這個表達式已經切割好了,放在一個棧(第二步有講)里面,我們通過對棧操作實現全部運算。

first?: = ?pop()
while ????stack?is?not?empty
????
do ???????operator?: = ?pop()
???????????????second????:
= ?pop()
???????????????res????????????:
= ??first??? < operator > ??second
???????????????push(res)
???????????????first??????????:
= ??pop()
return ?first

以上的計算是基于:運算符優先級一樣,格式正確。剩下的就是來切割解析這個表達式使之成為這種結構。我們只需要一直解析這個字符串,如果出現,標點則前面的就是一個數,我們將它壓入棧中。就是類似的方法嘍。

p: = ""
n:
= 1
while ???n <= length[expression]
????????
do ????? if ???expression[n]?is?the?operator
???????????????????????then?????
if ???not???p = ""
??????????????????????????????????????????then???push(p)
????????????????????????????????????????????????????? p=""
????????????????????????????????????push(expression[n])
???????????????????????
else ??????p: = p + expression[n]
?????????????????n:
= n + 1
return ?stack


好了,我們現在是同優先級的沒有問題了,如果有高優先級的怎么辦呢?
如果只考慮+-*/那么只要是*/號出現就可以對其操作符左右的數據進行運算了。也就是說在上面的偽代碼里面我們需要加一步判斷operator是否為*/的情況,然后進行運算。但是如果我們只掃描到operator就要運算,對于一個雙目運算符來說還差一邊啊,那么我們能否將這個判斷推遲到壓入數字的時候進行呢?這樣我們需要在壓入數據的時候提出前面的若干項進行處理了。

p: = ""
n:
= 1
while ???n <= length[expression]
????????
do ????? if ???expression[n]?is?the?operator
???????????????????????then?????
if ???not???p = ""
??????????????????????????????????????????then???
?????????????????????????????????????????????????????
// Be?careful
?????????????????????????????????????????????????????operator?: = ?pop()
?????????????????????????????????????????????????????
if ????operator?is?the? * ??or? /
????????????????????????????????????????????????????????????then??
????????????????????????????????????????????????????????????????????first?:
= ?pop()
????????????????????????????????????????????????????????????????????second?:
= p
????????????????????????????????????????????????????????????????????p:
= ?first? < operator > ?second
?????????????????????????????????????????????????????push(p)
?????????????????????????????????????????????????????p
= ""
????????????????????????????????????push(expression[n])
???????????????????????
else ??????p: = p + expression[n]
?????????????????n:
= n + 1
return ?stack

如此以來我們實現了+-*/了,HOHO 不錯吧,思路就是這樣一步一步來的。

下面我們想加入括號了,現在我們繼續想,其實括號就是更高的一層優先級了,由于基于以上的運算處理,在括號“縫合”(即碰到了')')的時候括號里面只有加減法,也就是說剛剛的棧處理結束標志是表達式末尾開始的標志就是表達式開頭,而這里的開頭是‘(’結尾是‘)’,還有什么區別嗎?其實沒什么了,那么我們按照這個思路,如果expression[n]是括號,‘(’壓入棧中,')'開始運算將結果壓入棧中。這樣看似乎不難哦。

p: = ""
n:
= 1
while ???n <= length[expression]
????????
do ????? if ???expression[n]?is?the?operator
???????????????????????then?????
if ???not???p = ""
??????????????????????????????????????????then???
?????????????????????????????????????????????????????
// Be?careful
?????????????????????????????????????????????????????operator?: = ?pop()
?????????????????????????????????????????????????????
if ????operator?is?the? * ??or? /
????????????????????????????????????????????????????????????then??
????????????????????????????????????????????????????????????????????first?:
= ?pop()
????????????????????????????????????????????????????????????????????second?:
= p
????????????????????????????????????????????????????????????????????p:
= ?first? < operator > ?second
?????????????????????????????????????????????????????push(p)
?????????????????????????????????????????????????????p
= ""
????????????????????????????????????push(expression[n])
???????????????????????elseif???expression[n]?is?the?bracket?(?or?)
???????????????????????????????????then
???????????????????????????????????????????
if ??expression[n] = " ( "
???????????????????????????????????????????????then?push(expression[n])
???????????????????????????????????????????????
else ? res:=compute?the?expression?between?the? " ( " ?and? " ) "
???????????????????????????????????????????????????????? //Push the result
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? push(res)
????
???????????????????????
else ??????p: = p + expression[n]
?????????????????n:
= n + 1
return ?stack

這樣看似乎很爽啊,但是大家看看這個表達式? 1+(2+3*4)*(5+6)
計算結果是 165? 而不是正確結果 155.為什么呢?
因為我們在計算之后直接壓入棧中而忽略了前面的那個*號。至此我們應該知道,一旦壓入數據就得檢查前面的operator.
這樣以來我們需要對push(object)單獨再包裝一下,使它明白只要壓入就得檢查.

至此我們已經知道了基本的運算體系。
在實際編碼過程中,大家可能要碰到大量的邊界討論問題,這一定要小心。
關于乘方和小數問題我將盡快寫出來。

計算器制作JAVA版(第三步,表達式求值(+-*/))


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 黄浦区| 永平县| 兴海县| 容城县| 麻江县| 大荔县| 安平县| 嘉荫县| 临邑县| 明光市| 津南区| 安多县| 洛宁县| 故城县| 隆回县| 南开区| 镇雄县| 惠安县| 新宾| 团风县| 健康| 淅川县| 张北县| 平江县| 扶绥县| 绍兴县| 隆回县| 罗源县| 高州市| 石河子市| 焦作市| 杭锦后旗| 海宁市| 七台河市| 大同县| 华蓥市| 苍溪县| 石门县| 卓尼县| 武隆县| 太和县|