Go数据结构:堆栈

Go中Stack数据结构的分析与实现

堆栈是遵循后进先出(LIFO)原则的项目的有序集合。我们从堆的同一部分(称为顶部)中添加和删除项目。我们无法从基础中删除项目。就像一堆书。

从创建访问页面的历史记录到输入的命令以及存储可以撤消的操作,堆栈都有许多用途。

执行

在内部,堆栈将用一个slice类型,我将揭露

  • Push()
  • Pull()
  • New()

方法。

New()用作构造函数,当我们开始使用它时会初始化内部切片。

我将创建一个ItemStack泛型类型,并发安全,可以通过使用以下命令生成包含任何类型的堆栈genny,以创建特定于类型的堆栈实现,封装包含数据的实际特定于值的数据结构。

// Package stack creates a ItemStack data structure for the Item type
package stack

import ( “sync”

<span style="color:#e6db74">"github.com/cheekybits/genny/generic"</span>

)

// Item the type of the stack type Item generic.Type

// ItemStack the stack of Items type ItemStack struct { items []Item lock sync.RWMutex }

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

// Push adds an Item to the top of the stack func (s *ItemStack) Push(t Item) { s.lock.Lock() s.items = append(s.items, t) s.lock.Unlock() }

// Pop removes an Item from the top of the stack func (s ItemStack) Pop() Item { s.lock.Lock() item := s.items[len(s.items)-1] s.items = s.items[0 : len(s.items)-1] s.lock.Unlock() return &item }

测验

这些测试描述了上述实现的用法。

package stack

import ( “testing” )

var s ItemStack

func initStack() *ItemStack { if s.items == nil { s = ItemStack{} s.New() } return &s }

func TestPush(t *testing.T) { s := initStack() s.Push(1) s.Push(2) s.Push(3) if size := len(s.items); size != 3 { t.Errorf(“wrong count, expected 3 and got %d”, size) } }

func TestPop(t *testing.T) { s.Pop() if size := len(s.items); size != 2 { t.Errorf(“wrong count, expected 2 and got %d”, size) }

<span style="color:#a6e22e">s</span>.<span style="color:#a6e22e">Pop</span>()
<span style="color:#a6e22e">s</span>.<span style="color:#a6e22e">Pop</span>()
<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">size</span> <span style="color:#f92672">:=</span> len(<span style="color:#a6e22e">s</span>.<span style="color:#a6e22e">items</span>); <span style="color:#a6e22e">size</span> <span style="color:#f92672">!=</span> <span style="color:#ae81ff">0</span> {
    <span style="color:#a6e22e">t</span>.<span style="color:#a6e22e">Errorf</span>(<span style="color:#e6db74">"wrong count, expected 0 and got %d"</span>, <span style="color:#a6e22e">size</span>)
}

}

创建一个具体的堆栈数据结构

您可以使用以下通用实现来生成特定于类型的堆栈,方法是:

//generate a `IntStack` stack of `int` values
genny -in stack.go -out stack-int.go gen "Item=int"

//generate a </span>StringStack<span style="color:#e6db74"> stack of </span>string<span style="color:#e6db74"> values genny -in stack.go -out stack-string.go gen “Item=string”


更多教程: