欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang棧結(jié)構(gòu)和后綴表達式實現(xiàn)計算器示例

 更新時間:2022年07月12日 11:49:54   作者:wuYin  
這篇文章主要為大家介紹了Golang棧結(jié)構(gòu)和后綴表達式實現(xiàn)計算器示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

只進行基本的四則運算,利用棧結(jié)構(gòu)和后綴表達式來計算數(shù)學(xué)表達式的值。

本文代碼:GitHub 

運行效果:

問題

如果只能進行兩個值的加減乘除,如何編程計算一個數(shù)學(xué)表達式的值?

比如計算 1+2*3+(4*5+6)*7,我們知道優(yōu)先級順序 () 大于 * / 大于 + - ,直接計算得 1+6+26*7 = 189

中綴、后綴表達式的計算

人利用中綴表達式計算值

數(shù)學(xué)表達式的記法分為前綴、中綴和后綴記法,其中中綴就是上邊的算術(shù)記法: 1+2*3+(4*5+6)*7,人計算中綴表達式的值:把表達式分為三部分1 2+3 (4*5+6)*7 分別計算值,求和得 189。但這個理解過程在計算機上的實現(xiàn)就復(fù)雜了。

計算機利用后綴表達式計算值

中綴表達式 1+2*3+(4*5+6)*7 對應(yīng)的后綴表達式: 123*+45*6+7*+,計算機使用棧計算后綴表達式值:

計算后綴表達式的代碼實現(xiàn)

func calculate(postfix string) int {
    stack := stack.ItemStack{}
    fixLen := len(postfix)
    for i := 0; i < fixLen; i++ {
        nextChar := string(postfix[i])
        // 數(shù)字:直接壓棧
        if unicode.IsDigit(rune(postfix[i])) {
            stack.Push(nextChar)
        } else {
            // 操作符:取出兩個數(shù)字計算值,再將結(jié)果壓棧
            num1, _ := strconv.Atoi(stack.Pop())
            num2, _ := strconv.Atoi(stack.Pop())
            switch nextChar {
            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())
    return result
}

現(xiàn)在只需知道如何將中綴轉(zhuǎn)為后綴,再利用棧計算即可。

中綴表達式轉(zhuǎn)后綴表達式

轉(zhuǎn)換過程

從左到右逐個字符遍歷中綴表達式,輸出的字符序列即是后綴表達式:

遇到數(shù)字直接輸出

遇到運算符則判斷:

  • 棧頂運算符優(yōu)先級更低則入棧,更高或相等則直接輸出
  • 棧為空、棧頂是 ( 直接入棧
  • 運算符是 則將棧頂運算符全部彈出,直到遇見 )
  • 中綴表達式遍歷完畢,運算符棧不為空則全部彈出,依次追加到輸出

轉(zhuǎn)換的代碼實現(xiàn)

// 中綴表達式轉(zhuǎn)后綴表達式
func infix2ToPostfix(exp string) string {
    stack := stack.ItemStack{}
    postfix := ""
    expLen := len(exp)
    // 遍歷整個表達式
    for i := 0; i < expLen; i++ {
        char := string(exp[i])
        switch char {
        case " ":
            continue
        case "(":
            // 左括號直接入棧
            stack.Push("(")
        case ")":
            // 右括號則彈出元素直到遇到左括號
            for !stack.IsEmpty() {
                preChar := stack.Top()
                if preChar == "(" {
                    stack.Pop() // 彈出 "("
                    break
                }
                postfix += preChar
                stack.Pop()
            }
            // 數(shù)字則直接輸出
        case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9":
            j := i
            digit := ""
            for ; j < expLen && unicode.IsDigit(rune(exp[j])); j++ {
                digit += string(exp[j])
            }
            postfix += digit
            i = j - 1 // i 向前跨越一個整數(shù),由于執(zhí)行了一步多余的 j++,需要減 1
        default:
            // 操作符:遇到高優(yōu)先級的運算符,不斷彈出,直到遇見更低優(yōu)先級運算符
            for !stack.IsEmpty() {
                top := stack.Top()
                if top == "(" || isLower(top, char) {
                    break
                }
                postfix += top
                stack.Pop()
            }
            // 低優(yōu)先級的運算符入棧
            stack.Push(char)
        }
    }
    // 棧不空則全部輸出
    for !stack.IsEmpty() {
        postfix += stack.Pop()
    }
    return postfix
}
// 比較運算符棧棧頂 top 和新運算符 newTop 的優(yōu)先級高低
func isLower(top string, newTop string) bool {
    // 注意 a + b + c 的后綴表達式是 ab + c +,不是 abc + +
    switch top {
    case "+", "-":
        if newTop == "*" || newTop == "/" {
            return true
        }
    case "(":
        return true
    }
    return false
}

總結(jié)

計算機計算數(shù)學(xué)表達式的值分成了 2 步,利用 stack 將人理解的中綴表達式轉(zhuǎn)為計算機理解的后綴表達式,再次利用 stack 計算后綴表達式的值。

以上就是Golang棧結(jié)構(gòu)和后綴表達式實現(xiàn)計算器示例的詳細(xì)內(nèi)容,更多關(guān)于Golang計算器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • go mod 使用私有g(shù)itlab群組的解決方案

    go mod 使用私有g(shù)itlab群組的解決方案

    這篇文章主要介紹了go mod 使用私有g(shù)itlab群組的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go語言標(biāo)準(zhǔn)庫中math模塊詳細(xì)功能介紹與示例代碼

    Go語言標(biāo)準(zhǔn)庫中math模塊詳細(xì)功能介紹與示例代碼

    Go語言的標(biāo)準(zhǔn)庫math提供了一系列基礎(chǔ)數(shù)學(xué)函數(shù)和常量,用于進行科學(xué)計算、幾何計算和其他數(shù)學(xué)相關(guān)的操作,這篇文章主要介紹了Go語言標(biāo)準(zhǔn)庫中math模塊詳細(xì)功能介紹與示例代碼,需要的朋友可以參考下
    2025-03-03
  • Go語言基本的語法和內(nèi)置數(shù)據(jù)類型初探

    Go語言基本的語法和內(nèi)置數(shù)據(jù)類型初探

    這篇文章主要介紹了Go語言基本的語法和內(nèi)置數(shù)據(jù)類型,是golang入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • Go切片的具體使用

    Go切片的具體使用

    本文主要介紹了Go切片的具體使用,包括聲明切片、初始化切片、切片的切割、切片的添加、切片的刪除、切片的復(fù)制、切片的遍歷、多維切片等,感興趣的可以了解一下
    2023-11-11
  • Go語言中的數(shù)據(jù)格式(json、xml?、msgpack、protobuf)使用總結(jié)

    Go語言中的數(shù)據(jù)格式(json、xml?、msgpack、protobuf)使用總結(jié)

    在分布式的系統(tǒng)中,因為涉及到數(shù)據(jù)的傳輸,所以一定會進行數(shù)據(jù)的交換,此時就要定義數(shù)據(jù)交換的格式,例如二進制、Json、Xml等等。本文總結(jié)了Go語言中的數(shù)據(jù)格式,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Go語言操作Excel的實現(xiàn)示例

    Go語言操作Excel的實現(xiàn)示例

    excelize是一個功能豐富且易于使用的Go語言庫,它極大地簡化了Excel文件的讀寫操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • 使用Golang調(diào)用攝像頭并進行圖像處理

    使用Golang調(diào)用攝像頭并進行圖像處理

    近年來,攝像頭成為了我們生活中不可或缺的設(shè)備之一,從智能手機到安全監(jiān)控系統(tǒng),無處不在的攝像頭給我們帶來了便利和安全,在開發(fā)攝像頭相關(guān)的應(yīng)用程序時,選擇一種高效和易用的編程語言是非常重要的,本文將介紹如何使用Golang調(diào)用攝像頭并進行圖像處理
    2023-11-11
  • go數(shù)據(jù)結(jié)構(gòu)和算法BitMap原理及實現(xiàn)示例

    go數(shù)據(jù)結(jié)構(gòu)和算法BitMap原理及實現(xiàn)示例

    這篇文章主要為大家介紹了go數(shù)據(jù)結(jié)構(gòu)和算法BitMap原理及實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 使用?gomonkey?Mock?函數(shù)及方法示例詳解

    使用?gomonkey?Mock?函數(shù)及方法示例詳解

    在 Golang 語言中,寫單元測試的時候,不可避免的會涉及到對其他函數(shù)及方法的 Mock,即在假設(shè)其他函數(shù)及方法響應(yīng)預(yù)期結(jié)果的同時,校驗被測函數(shù)的響應(yīng)是否符合預(yù)期,這篇文章主要介紹了使用?gomonkey?Mock?函數(shù)及方法,需要的朋友可以參考下
    2022-06-06
  • 玩轉(zhuǎn)Go命令行工具Cobra

    玩轉(zhuǎn)Go命令行工具Cobra

    這篇文章主要介紹了玩轉(zhuǎn)Go命令行工具Cobra,本文介紹了Cobra的最基本也是最常用的使用部分,但是Cobra仍然有很多優(yōu)秀的操作值得我們學(xué)習(xí),需要的朋友可以參考下
    2022-08-08

最新評論