为了账号安全,请及时绑定邮箱和手机立即绑定

go语言数据结构 环形队列

标签:
Go 数据结构

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)
    })
}
点击查看更多内容
2人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消