




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第Golang棧結構和后綴表達式實現計算器示例目錄引言問題中綴、后綴表達式的計算人利用中綴表達式計算值計算機利用后綴表達式計算值計算后綴表達式的代碼實現中綴表達式轉后綴表達式轉換過程轉換的代碼實現總結
引言
只進行基本的四則運算,利用棧結構和后綴表達式來計算數學表達式的值。
本文代碼:GitHub
運行效果:
問題
如果只能進行兩個值的加減乘除,如何編程計算一個數學表達式的值?
比如計算1+2*3+(4*5+6)*7,我們知道優(yōu)先級順序()大于*/大于+-,直接計算得1+6+26*7=189
中綴、后綴表達式的計算
人利用中綴表達式計算值
數學表達式的記法分為前綴、中綴和后綴記法,其中中綴就是上邊的算術記法:1+2*3+(4*5+6)*7,人計算中綴表達式的值:把表達式分為三部分12+3(4*5+6)*7分別計算值,求和得189。但這個理解過程在計算機上的實現就復雜了。
計算機利用后綴表達式計算值
中綴表達式1+2*3+(4*5+6)*7對應的后綴表達式:123*+45*6+7*+,計算機使用棧計算后綴表達式值:
計算后綴表達式的代碼實現
funccalculate(postfixstring)int{
stack:=stack.ItemStack{}
fixLen:=len(postfix)
fori:=0;ifixLen;i++{
nextChar:=string(postfix[i])
//數字:直接壓棧
ifunicode.IsDigit(rune(postfix[i])){
stack.Push(nextChar)
}else{
//操作符:取出兩個數字計算值,再將結果壓棧
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
}
現在只需知道如何將中綴轉為后綴,再利用棧計算即可。
中綴表達式轉后綴表達式
轉換過程
從左到右逐個字符遍歷中綴表達式,輸出的字符序列即是后綴表達式:
遇到數字直接輸出
遇到運算符則判斷:
棧頂運算符優(yōu)先級更低則入棧,更高或相等則直接輸出棧為空、棧頂是(直接入棧運算符是)則將棧頂運算符全部彈出,直到遇見)中綴表達式遍歷完畢,運算符棧不為空則全部彈出,依次追加到輸出
轉換的代碼實現
//中綴表達式轉后綴表達式
funcinfix2ToPostfix(expstring)string{
stack:=stack.ItemStack{}
postfix:=""
expLen:=len(exp)
//遍歷整個表達式
fori:=0;iexpLen;i++{
char:=string(exp[i])
switchchar{
case"":
continue
case"(":
//左括號直接入棧
stack.Push("(")
case")":
//右括號則彈出元素直到遇到左括號
for!stack.IsEmpty(){
preChar:=stack.Top()
ifpreChar=="("{
stack.Pop()//彈出"("
break
postfix+=preChar
stack.Pop()
//數字則直接輸出
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向前跨越一個整數,由于執(zhí)行了一步多余的j++,需要減1
default:
//操作符:遇到高優(yōu)先級的運算符,不斷彈出,直到遇見更低優(yōu)先級運算符
for!stack.IsEmpty(){
top:=stack.Top()
iftop=="("||isLower(top,char){
break
postfix+=top
stack.Pop()
//低優(yōu)先級的運算符入棧
stack.Push(char)
//棧不空則全部輸出
for!stack.IsEmpty(){
postfix+=stack.Pop()
returnpostfix
//比較運算符棧棧頂top和新運算符newTop的優(yōu)先級高低
funcisLower(topstring,newTopstring)bool{
//注意a+b+c的后綴表達式是ab+c+,不是abc++
switchtop{
case"+","-":
ifnewTop=="*"||newTop=="/"{
returntrue
case"(":
returntrue
returnfalse
}
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教育機器人技術在特殊教育中的運用
- 教育技術中的交互設計-以包容性為核心
- 公交優(yōu)先戰(zhàn)略下2025年城市交通擁堵治理成本效益分析報告
- 福建省泉州市2024-2025學年九上化學期末經典模擬試題含解析
- 嵩山少林武術職業(yè)學院《企業(yè)文化建設》2023-2024學年第一學期期末試卷
- 承德護理職業(yè)學院《汽車造型設計2》2023-2024學年第一學期期末試卷
- 宿遷職業(yè)技術學院《網頁設計與制作實驗》2023-2024學年第一學期期末試卷
- 陜西科技大學鎬京學院《建筑火災防治與風險評估》2023-2024學年第一學期期末試卷
- 云南彌勒市2024年化學九上期末綜合測試模擬試題含解析
- 藁城舒卿培訓課件
- 暑假社會實踐安全教育
- 2025年自考有效溝通技巧試題及答案
- 2025年教育管理與政策研究考試試題及答案
- 商場物業(yè)外包合同協(xié)議
- 義務教育《藝術課程標準》2022年修訂版(原版)
- 2025民宿租賃合同標準范本
- 云倉公司規(guī)章管理制度
- 落實責任制整體護理總結
- 汽車返利協(xié)議書范本
- 植物營養(yǎng)學測試試題及答案
- 2025年小學數學新教材培訓
評論
0/150
提交評論