欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

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

系統 2225 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條評論
主站蜘蛛池模板: 四虎4hutv永久在线影院 | 国产欧美日韩亚洲精品区2345 | 国产精品一区二区三区在线播放 | 日韩黄色精品视频 | 中国欧美日韩一区二区三区 | 成人福利在线视频免费观看 | 免费v片 | 国产一区久久 | 国产精品1区2区3区 一级电影免费 | 精品久久久影院 | 中文字幕一区二区三区四区不卡 | 国产在线自在拍91精品黑人 | 国产亚洲精品久久久久久打不开 | 婷婷黄色| 春宵福利网站在线观看 | 欧美freexx| 色综合久久88中文字幕 | 亚洲国产91 | 黄片毛片免费观看 | 天天碰夜夜 | 久久久久久网站 | 午夜影院在线播放 | 欧美日韩国产色综合一二三四 | 天天射天天做 | 超级97碰碰碰碰久久久久最新 | 天天狠狠色噜噜 | 两性欧美 | 国产欧美日韩精品一区 | www.伊人网 | 日韩欧美国产中文 | 天天插夜夜 | 香蕉国产成版人视频在线观看 | 无码免费人妻A片AAA毛片一区 | 一区二区三区四区免费看 | 亚洲精品中文字幕在线观看 | 91在线中文| 亚洲电影在线观看 | 天堂网中文字幕 | a黄在线观看 | 99在线精品视频 | 丁香午夜 |