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

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

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

引言

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

本文代碼:GitHub 

運(yùn)行效果:

問(wè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á)式分為三部分1 2+3 (4*5+6)*7 分別計(jì)算值,求和得 189。但這個(gè)理解過(guò)程在計(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)

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 {
            // 操作符:取出兩個(gè)數(shù)字計(jì)算值,再將結(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)為后綴,再利用棧計(jì)算即可。

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

轉(zhuǎn)換過(guò)程

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

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

遇到運(yùn)算符則判斷:

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

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

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

總結(jié)

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

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

相關(guān)文章

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

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

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

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

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

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

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

    Go切片的具體使用

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

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

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

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

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

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

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

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

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

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

    在 Golang 語(yǔ)言中,寫(xiě)單元測(cè)試的時(shí)候,不可避免的會(huì)涉及到對(duì)其他函數(shù)及方法的 Mock,即在假設(shè)其他函數(shù)及方法響應(yīng)預(yù)期結(jié)果的同時(shí),校驗(yàn)被測(cè)函數(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

最新評(píng)論