使用glang实现的栈及测试

代码

stack.go

package stack

//defined a element struct
type Element struct {
	value interface{}
	prev  *Element
}

// Prev get the prev element
func (e *Element) Prev() *Element {
	if p := e.prev; p != nil {
		return p
	}
	return nil
}

func (e *Element) Value() interface{} {
	return e.value
}

// defined an stack
type Stack struct {
	top *Element
	len int
}

// init the stack
func (s *Stack) Init() *Stack {
	s.top = nil
	s.len = 0
	return s
}

func New() *Stack {
	return new(Stack).Init()
}

func (s *Stack) Pop() *Element {
	if s.Len() == 0 {
		return nil
	}
	t := s.top
	s.top = t.prev
	s.len--
	return t
}

func (s *Stack) Push(e *Element) {
	e.prev = s.top
	s.top = e
	s.len++
}

func (s *Stack) Peek() *Element {
	return s.top
}

func (s *Stack) Len() int {
	return s.len
}

测试

stack_test.go

package stack

import (
	"math/rand"
	"testing"
	"time"
)

var answer = []string{
	"php",
	"go",
	"c++",
	"js",
	"java",
	"dd",
	"css",
	"html",
}

func BenchmarkStack_Push(b *testing.B) {
	l := len(answer)
	s := New()
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		rand.Seed(time.Now().UnixNano())
		r := rand.Intn(l)
		s.Push(&Element{value: answer[r]})
	}
}

func BenchmarkStack_Pop(b *testing.B) {
	l := len(answer)
	s := New()
	for i := 0; i < 100000; i++ {
		rand.Seed(time.Now().UnixNano())
		r := rand.Intn(l)
		s.Push(&Element{value: answer[r]})
	}
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		s.Pop()
	}
}

func TestStack_Push(t *testing.T) {
	s := New()
	for _, e := range answer {
		s.Push(&Element{value: e})
	}
	//s.Pop()
	top := s.Peek()
	v := top.Value()
	// type assertion
	a, ok := v.(string)
	if !ok {
		t.Error("type assertion error")
	}

	if a != "html" {
		t.Error("expected html, actual", a)
	}

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值