自己写了一个Stack的实现方式,三种方法
通过golang的slice方式实现,偏向结构化的方式实现;
funcPushS(s*[]int,vint){ fmt.Printf("%p,%p\n",s,*s) *s=append(*s,v) } funcPopS(s*[]int)int{ iflen(*s)==0{ return0 } len:=len(*s) fmt.Println("lenofstack",len) v:=(*s)[len-1] *s=(*s)[:len-1] returnv } funcmain(){ stack:=make([]int,0) PushS(&stack,5) PushS(&stack,10) v:=PopS(&stack) fmt.Println(v,stack) }通过对象的方式实现
typestack[]int func(sstack)Push(vint)stack{ returnappend(s,v) } func(sstack)Pop()(stack,int){ l:=len(s) ifl==0{ returns,0 } returns[:l-1],s[l-1] } funcmain(){ s:=make(stack,0) s=s.Push(10) s=s.Push(11) s=s.Push(12) fmt.Println(s) s,v:=s.Pop() s,v=s.Pop() fmt.Println(s,v) s,v=s.Pop() fmt.Println(s,v) }增加lock模式这样在多协程的方式下也能正常处理;
typestkstruct{ locksync.Mutex s[]int } funcNewStk()*stk{ return&stk{sync.Mutex{},make([]int,0)} } func(s*stk)Push(vint){ s.lock.Lock() defers.lock.Unlock() s.s=append(s.s,v) } func(s*stk)Pop()(int,error){ s.lock.Lock() s.lock.Unlock() len:=len(s.s) iflen==0{ return-1,errors.New("EmptyStack") } v:=s.s[len-1] s.s=s.s[:len-1] returnv,nil } funcmain(){ fmt.Println("hellogo") s:=NewStk() s.Push(10) s.Push(11) s.Push(12) fmt.Println(s.s) vv,_:=s.Pop() vv,_=s.Pop() fmt.Println(s.s,vv) }本文内容总结:栈的Golang实现过程,自己写的,参考网络一,参考网络资源二,godoc的参考代码实现,
原文链接:https://www.cnblogs.com/gpan/p/9836119.html