【golang】用container/list实现栈(Stack)

chinabrle · · 5609 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

go语言中的container有heap、list、ring,没有stack。

其中heap是优先级队列,虽然有Push()/Pop()接口,但是使用heap要实现heap.Interface接口,不够简洁。

所以这里用list封装了一个简单的stack,留作他用。

 package stack
 
 import "container/list"
 
 type Stack struct {
     list *list.List
 }
 
 func NewStack() *Stack {
     list := list.New()
     return &Stack{list}
 }
 
 func (stack *Stack) Push(value interface{}) {
     stack.list.PushBack(value)
 }
 
 func (stack *Stack) Pop() interface{} {
     e := stack.list.Back()
     if e != nil {
         stack.list.Remove(e)
         return e.Value
     }
     return nil
 }
 
 func (stack *Stack) Peak() interface{} {
     e := stack.list.Back()
     if e != nil {
         return e.Value
     }
 
     return nil
 }
 
 func (stack *Stack) Len() int {
     return stack.list.Len()
 }
 
 func (stack *Stack) Empty() bool {
     return stack.list.Len() == 0
 }

 

测试代码:

 package stack
 
 import "testing"
 
 func TestStack(t *testing.T) {
     stack := NewStack()
     stack.Push(1)
     stack.Push(2)
     stack.Push(3)
     stack.Push(4)
 
     len := stack.Len()
     if len != 4 {
         t.Errorf("stack.Len() failed. Got %d, expected 4.", len)
     }
 
     value := stack.Peak().(int)
     if value != 4 {
         t.Errorf("stack.Peak() failed. Got %d, expected 4.", value)
     }
 
     value = stack.Pop().(int)
     if value != 4 {
         t.Errorf("stack.Pop() failed. Got %d, expected 4.", value)
     }
 
     len = stack.Len()
     if len != 3 {
         t.Errorf("stack.Len() failed. Got %d, expected 3.", len)
     }
 
     value = stack.Peak().(int)
     if value != 3 {
         t.Errorf("stack.Peak() failed. Got %d, expected 3.", value)
     }
 
     value = stack.Pop().(int)
     if value != 3 {
         t.Errorf("stack.Pop() failed. Got %d, expected 3.", value)
     }
 
     value = stack.Pop().(int)
     if value != 2 {
         t.Errorf("stack.Pop() failed. Got %d, expected 2.", value)
     }
 
     empty := stack.Empty()
     if empty {
         t.Errorf("stack.Empty() failed. Got %d, expected false.", empty)
     }
 
     value = stack.Pop().(int)
     if value != 1 {
         t.Errorf("stack.Pop() failed. Got %d, expected 1.", value)
     }
 
     empty = stack.Empty()
     if !empty {
         t.Errorf("stack.Empty() failed. Got %d, expected true.", empty)
     }
 
     nilValue := stack.Peak()
     if nilValue != nil {
         t.Errorf("stack.Peak() failed. Got %d, expected nil.", nilValue)
     }
 
     nilValue = stack.Pop()
     if nilValue != nil {
         t.Errorf("stack.Pop() failed. Got %d, expected nil.", nilValue)
     }
 
     len = stack.Len()
     if len != 0 {
         t.Errorf("stack.Len() failed. Got %d, expected 0.", len)
     }
 }

 下载stack.zip

本文来自:博客园

感谢作者:chinabrle

查看原文:【golang】用container/list实现栈(Stack)

5609 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传