理论介绍
队列(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.")
}
}