




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第Golang棧結(jié)構(gòu)和后綴表達(dá)式實(shí)現(xiàn)計(jì)算器示例目錄引言問題中綴、后綴表達(dá)式的計(jì)算人利用中綴表達(dá)式計(jì)算值計(jì)算機(jī)利用后綴表達(dá)式計(jì)算值計(jì)算后綴表達(dá)式的代碼實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式轉(zhuǎn)換過程轉(zhuǎn)換的代碼實(shí)現(xiàn)總結(jié)
引言
只進(jìn)行基本的四則運(yùn)算,利用棧結(jié)構(gòu)和后綴表達(dá)式來計(jì)算數(shù)學(xué)表達(dá)式的值。
本文代碼:GitHub
運(yùn)行效果:
問題
如果只能進(jìn)行兩個(gè)值的加減乘除,如何編程計(jì)算一個(gè)數(shù)學(xué)表達(dá)式的值?
比如計(jì)算1+2*3+(4*5+6)*7,我們知道優(yōu)先級(jí)順序()大于*/大于+-,直接計(jì)算得1+6+26*7=189
中綴、后綴表達(dá)式的計(jì)算
人利用中綴表達(dá)式計(jì)算值
數(shù)學(xué)表達(dá)式的記法分為前綴、中綴和后綴記法,其中中綴就是上邊的算術(shù)記法:1+2*3+(4*5+6)*7,人計(jì)算中綴表達(dá)式的值:把表達(dá)式分為三部分12+3(4*5+6)*7分別計(jì)算值,求和得189。但這個(gè)理解過程在計(jì)算機(jī)上的實(shí)現(xiàn)就復(fù)雜了。
計(jì)算機(jī)利用后綴表達(dá)式計(jì)算值
中綴表達(dá)式1+2*3+(4*5+6)*7對(duì)應(yīng)的后綴表達(dá)式:123*+45*6+7*+,計(jì)算機(jī)使用棧計(jì)算后綴表達(dá)式值:
計(jì)算后綴表達(dá)式的代碼實(shí)現(xiàn)
funccalculate(postfixstring)int{
stack:=stack.ItemStack{}
fixLen:=len(postfix)
fori:=0;ifixLen;i++{
nextChar:=string(postfix[i])
//數(shù)字:直接壓棧
ifunicode.IsDigit(rune(postfix[i])){
stack.Push(nextChar)
}else{
//操作符:取出兩個(gè)數(shù)字計(jì)算值,再將結(jié)果壓棧
num1,_:=strconv.Atoi(stack.Pop())
num2,_:=strconv.Atoi(stack.Pop())
switchnextChar{
case"+":
stack.Push(strconv.Itoa(num1+num2))
case"-":
stack.Push(strconv.Itoa(num1-num2))
case"*":
stack.Push(strconv.Itoa(num1*num2))
case"/":
stack.Push(strconv.Itoa(num1/num2))
result,_:=strconv.Atoi(stack.Top())
returnresult
}
現(xiàn)在只需知道如何將中綴轉(zhuǎn)為后綴,再利用棧計(jì)算即可。
中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式
轉(zhuǎn)換過程
從左到右逐個(gè)字符遍歷中綴表達(dá)式,輸出的字符序列即是后綴表達(dá)式:
遇到數(shù)字直接輸出
遇到運(yùn)算符則判斷:
棧頂運(yùn)算符優(yōu)先級(jí)更低則入棧,更高或相等則直接輸出棧為空、棧頂是(直接入棧運(yùn)算符是)則將棧頂運(yùn)算符全部彈出,直到遇見)中綴表達(dá)式遍歷完畢,運(yùn)算符棧不為空則全部彈出,依次追加到輸出
轉(zhuǎn)換的代碼實(shí)現(xiàn)
//中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式
funcinfix2ToPostfix(expstring)string{
stack:=stack.ItemStack{}
postfix:=""
expLen:=len(exp)
//遍歷整個(gè)表達(dá)式
fori:=0;iexpLen;i++{
char:=string(exp[i])
switchchar{
case"":
continue
case"(":
//左括號(hào)直接入棧
stack.Push("(")
case")":
//右括號(hào)則彈出元素直到遇到左括號(hào)
for!stack.IsEmpty(){
preChar:=stack.Top()
ifpreChar=="("{
stack.Pop()//彈出"("
break
postfix+=preChar
stack.Pop()
//數(shù)字則直接輸出
case"0","1","2","3","4","5","6","7","8","9":
j:=i
digit:=""
for;jexpLenamp;amp;unicode.IsDigit(rune(exp[j]));j++{
digit+=string(exp[j])
postfix+=digit
i=j-1//i向前跨越一個(gè)整數(shù),由于執(zhí)行了一步多余的j++,需要減1
default:
//操作符:遇到高優(yōu)先級(jí)的運(yùn)算符,不斷彈出,直到遇見更低優(yōu)先級(jí)運(yùn)算符
for!stack.IsEmpty(){
top:=stack.Top()
iftop=="("||isLower(top,char){
break
postfix+=top
stack.Pop()
//低優(yōu)先級(jí)的運(yùn)算符入棧
stack.Push(char)
//棧不空則全部輸出
for!stack.IsEmpty(){
postfix+=stack.Pop()
returnpostfix
//比較運(yùn)算符棧棧頂top和新運(yùn)算符newTop的優(yōu)先級(jí)高低
funcisLower(topstring,newTopstring)bool{
//注意a+b+c的后綴表達(dá)式是ab+c+,不是abc++
switchtop{
case"+","-":
ifnewTop=="*"||newTop=="/"{
returntrue
case"(":
returntrue
returnfalse
}
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 自行車服務(wù)在歷史文化街區(qū)的融合考核試卷
- 花卉種植的園林景觀植物養(yǎng)護(hù)考核試卷
- 2025年工業(yè)爐窯的新型燃燒裝置項(xiàng)目建議書
- 橡膠板在電梯門擋板中的安全性能考核試卷
- 品牌營銷實(shí)際流程策劃
- 環(huán)保專業(yè)知識(shí)課件
- 中醫(yī)骨傷科學(xué)多媒體課件-中醫(yī)骨傷科學(xué)
- 2025年石英玻璃纖維套管項(xiàng)目建議書
- 福建高二考試試題及答案
- 嘉定國資委考試試題及答案
- 高考英語閱讀理解題干、選項(xiàng)及近五年高頻詞匯
- 廣東省華附、省實(shí)、廣雅、深中2025屆高三四校聯(lián)考語文試題與答案
- 骨科專業(yè)培訓(xùn)計(jì)劃及總結(jié)
- 2025年河北省職業(yè)院校技能大賽工業(yè)互聯(lián)網(wǎng)集成應(yīng)用參考試題庫(含答案)
- 鋼結(jié)構(gòu)鋼筋大棚施工方案
- 《春夏中醫(yī)養(yǎng)生》課件
- 機(jī)械通氣患兒的觀察與護(hù)理
- 2021年婦產(chǎn)科主治醫(yī)師資格考試題庫(含答案)
- 2024年短劇拍攝及制作協(xié)議版
- 《福建省城鎮(zhèn)道路清掃保潔作業(yè)指導(dǎo)價(jià)》
- 初級(jí)社會(huì)工作實(shí)務(wù)考試歷年考試真題(含答案)
評(píng)論
0/150
提交評(píng)論