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

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)

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。