golang 怎么设计一个栈
Go  /  管理员 发布于 7年前   206
栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈顶。
栈有时又叫LIFO(先进后出)表。 (推荐学习:go)
对栈的操作有Push(进栈)和Pop(出栈),前者相当于插入,后者相当于删除最后插入的元素。
以下用双向链表和切片实现分别实现栈操作
//stack//用双向链表实现stacktype Element interface {}var header *entry //链表表头var size int //栈的长度type entry struct { previous *entry next *entry element Element}func newEntry(prev,next *entry,e Element) *entry { return &entry{prev,next,e}}//初始化header 表头func NewStack() *entry { header = newEntry(nil,nil,nil) header.previous =header header.next = header return header}type Stack interface { Push(e Element) //向栈顶添加元素 Pop() Element //移除栈顶元素 Top() Element //获取栈顶元素(不删除) Clear() bool //清空栈 Size() int//获取栈的元素个数 IsEmpty() bool //判断栈是否是空栈}//向栈顶添加元素func (e *entry) Push(element Element) { addBefore(header,element)}//移除栈顶元素func (e *entry) Pop() Element { if e.IsEmpty() { fmt.Println("stack is empty!") return nil } prevEntry := header.previous prevEntry.previous.next = header header.previous = prevEntry.previous size-- return prevEntry.element}//获取栈顶元素(不删除)func (e *entry) Top() Element { if e.IsEmpty() { fmt.Println("stack is empty!") return nil } return header.previous.element}//清空栈func (e *entry) Clear() bool { if e.IsEmpty() { fmt.Println("stack is empty!") return false } entry := header.next for entry != header { nextEntry := entry.next entry.next = nil entry.previous = nil entry.element = nil entry = nextEntry } header.next = header header.previous = header size =0 return true}func (e *entry) Size() int { return size}func (e *entry) IsEmpty() bool { if size == 0 { return true } return false}//在entry节点之前添加func addBefore(e *entry,element Element) Element{ newEntry := newEntry(e.previous,e,element) newEntry.previous.next = newEntry newEntry.next.previous = newEntry size++ return newEntry}//****************************************//****************************************//用切片实现Stacktype sliceEntry struct{ element []Element}func NewSliceEntry() *sliceEntry { return &sliceEntry{}}func (entry *sliceEntry)Push(e Element) { entry.element = append(entry.element,e)}func (entry *sliceEntry)Pop() Element { size := entry.Size() if size == 0 { fmt.Println("stack is empty!") return nil } lastElement := entry.element[size-1] entry.element[size-1] = nil entry.element = entry.element[:size-1] return lastElement}func (entry *sliceEntry)Top() Element { size := entry.Size() if size == 0 { fmt.Println("stack is empty!") return nil } return entry.element[size-1]}func (entry *sliceEntry)Clear() bool { if entry.IsEmpty() { fmt.Println("stack is empty!") return false } for i :=0;i<entry.Size();i++ { entry.element[i] = nil } entry.element = make([]Element,0) return true}func (entry *sliceEntry)Size() int { return len(entry.element)}func (entry *sliceEntry)IsEmpty() bool { if len(entry.element) == 0 { return true } return false}func main() { test1()}//测试双向链表实现的Stackfunc test1() { stack := NewStack() for i := 0;i<50;i++ { stack.Push(i) } fmt.Println(stack.Top()) fmt.Println(stack.Size()) fmt.Println(stack.Pop()) fmt.Println(stack.Top()) fmt.Println(stack.Clear()) fmt.Println(stack.IsEmpty()) for i := 0;i<50;i++ { stack.Push(i) } fmt.Println(stack.Top())}//测试切片实现的Stackfunc test2() { entry := NewSliceEntry() for i:= 0;i<50;i++ { entry.Push(i) } fmt.Println(entry.Size()) fmt.Println(entry.Top()) fmt.Println(entry.Pop()) fmt.Println(entry.Top(),entry.Size()) fmt.Println(entry.Clear()) for i:= 0;i<50;i++ { entry.Push(i) } fmt.Println(entry.Size())}//两种方法性能比较func test3() { t := time.Now() sliceStack := NewSliceEntry() for i:= 0;i<500000;i++ { sliceStack.Push(i) } fmt.Println(time.Since(t)) t = time.Now() stack := NewStack() for i:=0;i<500000;i++ { stack.Push(i) } fmt.Println(time.Since(t))}
以上就是golang 怎么设计一个栈的详细内容,更多请关注其它相关文章!
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号