数据结构和几个的基本API
package Bag
type Bag struct {
first *node
n int
}
type node struct {
item interface{}
next *node
}
func NewBag() Bag {
return Bag{}
}
func (b Bag) IsEmpty() bool {
return b.n == 0
}
func (b Bag) Size() int {
return b.n
}
func (b *Bag) Add(item interface{}) {
oldfirst := b.first
b.first = &node{}
b.first.item = item
b.first.next = oldfirst
b.n++
}
简单的背包迭代接口
由于go语言没有提供原生的迭代接口支持,所以想使用迭代就需要自己实现,恰巧迭代是背包这个数据结构的重要方法。以下是一个简单的迭代实现:
//导出背包中的全部元素为切片
func (b Bag) Iterator() []interface{} {
s := []interface{}{}
p := b.first
for i := 0; i < b.n; i++ {
s = append(s, p.item)
p = p.next
}
return s
}
这种简单的迭代实现原理是遍历链表,将其中所有的元素都导出为一个切片,然后返回,这样就可以通过go的for range迭代元素。
该方案会在迭代开始时将背包中的所有数据在内存中复制一份,这样做实现起来简单、迭代的速度很快,但是生成切片需要时间并且会占用双倍的内存,不适合数据量较大的情况。
改进后的迭代器
这一版迭代器的设计思路:在背包类中存储一个变量index,用来记录当前迭代到达的位置。
type Bag struct {
first *node
n int
index *node
}
//省略中间的方法
//初始化迭代器
func (b *Bag) InitIterator() {
b.index = b.first
}
//检查下一个元素
func (b Bag) HasNext() bool {
return b.index != nil
}
//获取下一个元素
func (b *Bag) Next() interface{} {
item := b.index.item
b.index = b.index.next
return item
}
下面是测试迭代器的代码:
fun