基础篇——Go语言队列实现

理论介绍

队列(queue), 是一种先进先出的线性表。通常用数据或者链表来实现队列。 队列只允许在后端插入,前端删除操作。
性质:
先进先出

代码实现

了解了队列的概念,实现一个队列也相当简单,下面看代码

package queue

type Item interface {
}

// Item the type of the queue
type ItemQueue struct {
    items []Item
}

type ItemQueuer interface {
    New() ItemQueue
    Enqueue(t Item)
    Dequeue() *Item
    IsEmpty() bool
    Size() int
}

// New creates a new ItemQueue
func (s *ItemQueue) New() *ItemQueue {
    s.items = []Item{}
    return s
}

// Enqueue adds an Item to the end of the queue
func (s *ItemQueue) Enqueue(t Item) {
    s.items = append(s.items, t)
}

// dequeue
func (s *ItemQueue) Dequeue() *Item {
    item := s.items[0] // 先进先出
    s.items = s.items[1:len(s.items)]

    return &item
}

func (s *ItemQueue) IsEmpty() bool {
    return len(s.items) == 0
}

// Size returns the number of Items in the queue
func (s *ItemQueue) Size() int {
    return len(s.items)
}

在代码中,我们使用go语言切片实现了一个队列,并且提供了以下几种方法
- New 新建一个队列
- Enqueue 入队,也就是给队列添加元素
- Dequeue 出队,从队列中取出元素
- IsEmpty 判断队列是否为空
- Size 求队列的大小

测试代码

package queue

import "testing"

var q ItemQueue

func initQueue() *ItemQueue  {
    if q.items == nil{
        q = ItemQueue{}
        q.New()
    }

    return &q
}

func TestItemQueue_Enqueue(t *testing.T) {
    q := initQueue()
    q.Enqueue(1)
    q.Enqueue(2)
    q.Enqueue(3)

    if size := q.Size(); size != 3{
        t.Errorf("wrong count, the correct count is 3 but got %d", size)
    }
}

func TestItemQueue_Dequeue(t *testing.T) {
    q.Dequeue()

    if size := q.Size(); size != 2{
        t.Errorf("test failed, the corrected value is 2, but got %d", size)
    }

    q.Dequeue()
    q.Dequeue()
    if !q.IsEmpty(){
        t.Errorf("the queue should be empty.")
    }
}

项目地址

参考教程

猜你喜欢

转载自blog.csdn.net/afar_ch/article/details/81153173
今日推荐