继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

go语言数据结构 环形队列

勤劳一沙鸥
关注TA
已关注
手记 5
粉丝 8
获赞 18

queen.go

package data_struct

import "log"

//环形队列实现 队列,先进先出。追加至队尾,弹出队顶
type Queen struct {
    Length   int64 //队列长度
    Capacity int64 //队列容量
    Head     int64 //队头
    Tail     int64 //队尾
    Data     []interface{}
}

//初始化
func MakeQueen(length int64) Queen {
    var q = Queen{
        Length: length,
        Data:   make([]interface{}, length),
    }
    return q
}

//判断是否为空
func (t *Queen) IsEmpty() bool {
    return t.Capacity == 0
}

//判断是否满
func (t *Queen) IsFull() bool {
    return t.Capacity == t.Length
}

//加一个元素
func (t *Queen) Append(element interface{}) bool {
    if t.IsFull() {
        log.Println("队列已满 ,无法加入")
        return false
    }
    t.Data[t.Tail] = element
    t.Tail++
    t.Capacity++
    return true
}

//弹出一个元素,并返回
func (t *Queen) OutElement() interface{} {
    if t.IsEmpty() {
        log.Println("队列为空,无法弹出")
    }
    defer func() {
        t.Capacity--
        t.Head++
    }()
    return t.Data[t.Head]
}

//遍历
func (t *Queen) Each(fn func(node interface{})) {
    for i := t.Head; i < t.Head+t.Capacity; i++ {
        fn(t.Data[i%t.Length])
    }
}

//清空
func (t *Queen) Clcear() bool {
    t.Capacity = 0
    t.Head = 0
    t.Tail = 0
    t.Data = make([]interface{}, t.Length)
    return true
}

queen_test.go

package data_struct

import (
    "fmt"
    "testing"
)

func TestQueen(t *testing.T) {
    var testLength = int64(4)
    q := MakeQueen(testLength)
    if q.Length != testLength {
        t.Error("MakeQueen(4)的容量不是4")
    }
    q.Append(10)
    q.Append(12)
    q.Append(14)
    q.Append(16)
    //q.Append(18)

    q.OutElement()
    //fmt.Println(q.OutElement())
    if q.Capacity != 3 {
        t.Error("队队长度不正确")
    }

    q.Each(func(node interface{}) {
        fmt.Println(node)
    })

    q.Clcear()
    if q.Capacity != 0 {
        t.Error("queen的长度不为0")
    }
    q.Each(func(node interface{}) {
        fmt.Println(node)
    })

    q.Append("B")
    q.Append('A')

    q.Each(func(node interface{}) {
        fmt.Println(node)
    })
}
打开App,阅读手记
2人推荐
发表评论
随时随地看视频慕课网APP

热门评论

请问在给环形队列添加元素的时候,为什么是容量+1,而不是长度+1呢?

查看全部评论