數據結構——Golang實現隊列

轉載請注明出處: 數據結構——Golang實現隊列

Golang

1. 介紹

隊列是一種特殊的線性表,特殊之處在于它只允許在表的前端(front)進行刪除操作,而在表的后端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。

數據結構里的隊列就是模仿現實中的排隊。

1) 新來的都排在隊尾;
2) 最前面的辦理業務后離隊,后面一個跟上。
根據特點,計算機磚家就歸納以下隊列結構。

image.png

2. Golang 實現

2.1. 隊列結構

同前文的棧一樣,在這里,我把隊列拆分為兩個部分,容器和鏈表,容器用結構體實現,鏈表用單鏈表,當然大家也可以用其他鏈表結構,甚至數組來實現。

這里的例子,也是使用單鏈表實現的。

// Queue 隊列信息
type Queue struct{
    list *SingleList
}

2.2. 隊列初始化

隊列的初始化,也即是內部的鏈表初始化:

// Init 隊列初始化
func (q *Queue)Init()  {
    q.list = new(SingleList)
    q.list.Init()
}

2.3. 入隊(Enqueue)

從隊尾添加數據到隊列,稱為入隊(Enqueue)

// Enqueue 進入隊列
func (q *Queue) Enqueue(data interface{}) bool{
    return q.list.Append(&SingleNode{Data:data})
}

2.4. 出隊(Dequeue)

從隊頭取出數據稱為出隊或出列(Dequeue)

// Dequeue 出列
func (q *Queue) Dequeue() interface{}{
    node := q.list.Get(0)
    if node == nil{
        return nil
    }
    q.list.Delete(0)
    return node.Data
}

2.5. 查看隊頭元素(Peek)

查看隊頭元素,但不取出:

// Peek 查看隊頭信息
func (q *Queue)Peek() interface{}{
    node := q.list.Get(0)
    if node == nil{
        return nil
    }
    return node.Data
}

2.6. 獲取隊列長度(Size)

獲取當前隊列中所有元素的數量:

// Size 獲取隊列長度
func (q *Queue) Size() uint{
    return q.list.Size
}

3. 單元測試

package dstr

import(
    "testing"
)

func TestQueue_Init(t *testing.T)  {
    q := new(Queue)
    q.Init()
}

func TestQueue_Enqueue(t *testing.T){
    q := new(Queue)
    q.Init()

    q.Enqueue(1)
    if 1 == q.Size(){
        t.Log("queue size and enquqeuesuccess")
    } else {
        t.Error("queue size and enqueue failed")
    }
}

func TestQueue_Dequeue(t *testing.T){
    q := new(Queue)
    q.Init()

    d1 := q.Dequeue()
    if d1 == nil{
        t.Log("empty queue dequeue success")
    } else {
        t.Error("empty queue dequeue failed")
    }

    q.Enqueue(1)
    d := q.Dequeue()
    if 1 == d.(int) && q.Size() == 0{
        t.Log("queue dequeue success")
    } else {
        t.Error("queue dequeue failed")
    }
}

func TestQueue_Peek(t *testing.T){
    q := new(Queue)
    q.Init()

    d1 := q.Peek()
    if d1 == nil{
        t.Log("empty queue peek success")
    }else {
        t.Error("empty queue peek failed")
    }

    q.Enqueue(1)
    d := q.Peek()
    if 1 == d.(int) && q.Size() == 1{
        t.Log("queue peek success")
    } else {
        t.Error("queue peek failed")
    } 
}

4. 源碼

github源碼

5. 參考文獻

Go數據結構之隊列

轉載請注明出處: 數據結構——Golang實現隊列

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容