golang數據結構之隊列


隊列可以用數組或鏈表實現,遵從先入先出。

目錄結構:

在main中調用queue包中的屬性和方法,如何調用參考另一篇文章: https://www.cnblogs.com/xiximayou/p/12005480.html

一個隊列需要有四要素:容量、隊首指針、隊尾指針、存儲數據的數組

當隊尾指針==容量-1時,此時隊列已滿,就不能再有數據進隊;

當隊首指針==隊尾指針時,此時隊列已空,就不能再從隊列中取出數據;

同時可以發現,這種隊列只能使用一次,因為那時隊首和隊尾都指向隊尾了。

代碼如下:

queue.go

package queue

import (
    "errors"
    "fmt"
)

//Queue 使用結構體管理隊列
type Queue struct {
    MaxSize int
    Array   [4]int //模擬隊列
    Front   int    //隊列首位
    Rear    int    //隊列尾部
}

//AddQueue 向隊列中添加一個值
func (q *Queue) AddQueue(val int) (err error) {
    q.MaxSize = 4
    //先判斷隊列是否已滿
    if q.Rear == q.MaxSize-1 {
        return errors.New("隊列已滿")
    }
    q.Rear++
    q.Array[q.Rear] = val
    return
}

//GetQueue 得到一個值
func (q *Queue) GetQueue() (val int, err error) {
    if q.Front == q.Rear {
        return -1, errors.New("隊列已空")
    }
    q.Front++
    val = q.Array[q.Front]
    return val, err
}

//ShowQueue 顯示隊列
func (q *Queue) ShowQueue() {
    for i := q.Front + 1; i <= q.Rear; i++ {
        fmt.Printf("queue[%d]=%v\t", i, q.Array[i])
    }
}

main.go

package main

import (
    "fmt"
    "go_code/data_structure/queue"
    "os"
)

func main() {
    var key string
    var val int
    q := &queue.Queue{
        MaxSize: 4,
        Front:   -1,
        Rear:    -1,
    }
    for {
        fmt.Println("------------------------------")
        fmt.Println("1.輸入add表示添加數據到隊列")
        fmt.Println("2.輸入get表示從隊列中獲取數據")
        fmt.Println("3.輸入show表示顯示隊列")
        fmt.Println("4.輸入exit表示退出")
        fmt.Println("------------------------------")
        fmt.Scanln(&key)
        switch key {
        case "add":
            fmt.Println("請輸入要添加的值:")
            fmt.Scanln(&val)
            err := q.AddQueue(val)
            if err != nil {
                fmt.Println(err)
            } else {
                fmt.Println("添加成功")
                fmt.Println("Rear:", q.Rear)
            }
        case "get":
            val, err := q.GetQueue()
            if err != nil {
                fmt.Println(err)
            } else {
                fmt.Println("得到的值為:", val)
                fmt.Println("Front", q.Front)
            }

        case "show":
            q.ShowQueue()
            fmt.Println()
        case "exit":
            os.Exit(0)
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM