您好!欢迎来到爱源码

爱源码

热门搜索: 抖音快手短视频下载   

Golang基本数据结构和算法堆栈 {源码交易}

  • 时间:2022-07-07 01:21 编辑: 来源: 阅读:272
  • 扫一扫,手机访问
摘要:Golang基本数据结构和算法堆栈 {源码交易}
《golang基本数据结构和算法栈起源》最近看到:& gt(【日】石田包惠;宫崎昭一)这一系列笔记要用到的golang练习的堆栈(也叫stack)也是线性数据排列的数据结构。然而,在这种结构中,我们只能访问最新的数据。 栈就像一堆书。当我们拿到一本新书时,我们会把它放在书架的最上面,而当我们拿起书时,我们只能从最上面的新书开始。 像stack这样最后添加的数据先取出,也就是“后进先出”结构,我们称之为后进先出,简称LIFO。 摘自:& gt(【日】石田包惠;目标是实现一个基于数组的LIFO堆栈。您可以指定阵列的初始容量。当元素数量超过容量时,它将自动扩展2倍,以提供一个免复制迭代器来遍历堆栈。并且可以检测并发修改错误。IStack:stack的接口:IStackIterator:stack迭代器的接口:tArrayStack:基于自扩展数组的堆栈,实现IStack接口tStackIterator:免复制堆栈迭代器,实现stack _ test的单元测试。IStackIterator接口_结构导入(ST " learning/gooop/data _ structure/stack " "测试")functest _ stack (t *测试。T) { fnAssertTrue := func(b bool,msg string) { if!b { panic(msg)} } stack:= ST . NewArrayStack(2)state:= stack。string()t . Log(state)fnAssertTrue(state = = " c = 2,t=-1,v=0,items:","状态错误")堆栈。Push(0)状态=堆栈。string()t . Log(state)fnAssertTrue(state = = " c = 2,t=0,v=1,items:0 ","状态错误")堆栈。Push(1)状态=堆栈。string()t . Log(state)fnAssertTrue(state = = " c = 2,t=1,v=2,items:0,1 ","状态错误")堆栈。Push(2)状态=堆栈。string()t . Log(state)fnAssertTrue(state = = " c = 4,t=2,v=3,items:0,1,2 ","状态错误")e,v := stack。Peek() fnAssertTrue(e == nil,"期望e == nil") fnAssertTrue(v == 2,"期望值2") e,v = stack。Pop()状态=堆栈。string()t . Log(state)fnAssertTrue(e = = nil,"期望e == nil") fnAssertTrue(v == 2,"期望值2") fnAssertTrue(state == "c=4,t=1,v=4,items:0,1 ","状态错误")e,v = stack。Pop()状态=堆栈。string()t . Log(state)fnAssertTrue(e = = nil,"期望e == nil") fnAssertTrue(v == 1,"期望值1") fnAssertTrue(state == "c=4,t=0,v=5,items:0 ","状态错误")e,v = stack。Pop()状态=堆栈。string()t . Log(state)fnAssertTrue(e = = nil,"期望e == nil") fnAssertTrue(v == 0,"期望值0") fnAssertTrue(state == "c=4,t=-1,v=6,items:","状态错误")e,v = stack。Pop() fnAssertTrue(e!= nil,"期望e!= nil") iter := stack。Iterator() fnAssertTrue(iter。More() == false,“期待更多()= = false”)e,v = iter。Next() fnAssertTrue(e!= nil,"期望e!= nil”)堆栈。Push(0)状态=堆栈。string()t . Log(state)fnAssertTrue(state = = " c = 4,t=0,v=7,items:0 ","状态错误")fnAssertTrue(iter。More() == false,“期待更多()= = false”)e,v = iter。Next() fnAssertTrue(e!= nil,"期望e!= nil”)堆栈。Push(1)状态=堆栈。string()t . Log(state)fnAssertTrue(state = = " c = 4,t=1,v=8,items:0,1 ","状态错误")iter = stack。Iterator() fnAssertTrue(iter。More() == true,“期待更多()= = true”)e,v = iter。next()fnAssertTrue(e = = nil & amp;& ampv == 0,“期望v = = 0”)e,v = iter。next()fnAssertTrue(e = = nil & amp;& ampV == 1," expecting v == 1")}测试输出$ go test-v stack _ test . go = = run test _ stack _ test . go:17:c = 2,t =-1,v = 0,items: stack _ test.go: 22:。t=0,v=1,items:0 stack_test.go:27: c=2,t=1,v=2,items:0,1 stack_test.go:32: c=4,t=2,v=3,items:0,1,2 stack_test.go:41: c=4,t=1,v=4,items:0,1 stack_test.go:48: c=4,t=0,v=5,items:0 stack_test.go:55 实现IStack接口包堆栈导入(" errors " " fmt " " strings ")type tarray stack struct { items[]interface { } capacity int top int version int 64 } var gEmptyStackError = errors。 new(" empty stack ")func new array stack(capacity int)is stack { if capacity & lt;0 { capacity = 0 }返回& amptarray stack { items:make([]interface { },capacity),capacity: capacity,top: -1,} } func(me * tarray stack)Size()int { return me . top+1 } func(me * tarray stack)is empty()bool { return me。size()& lt;= 0 } func(me * tarray stack)is not empty()bool { return!我。IsEmpty()} func(me * tarray stack)Push(value interface { }){ me . ensure capacity(me。size()+1)me . top ++ me . items[me . top]= value me . version++} func(me * tarray stack)ensure capacity(size int){ if me . capacity & gt;= size { return } forme.capacity & lt尺寸;{ me . capacity = maxInt(me . capacity * 2,me . capacity+1)} new items:= make([]interface { },me.capacity) copy(newItems,me . items)me . items = new items } func maxInt(x,y int)int { if x & gt;= y { return x } return y } func(me * tarray stack)Pop()(error,interface{}) { if me。IsEmpty(){ return gEmptyStackError,nil } it:= me . items[me . top]me . items[me . top]= nil me . top-me . version++ return nil,it } func(me * tarray stack)Peek()(error,interface{}) { if me .IsEmpty(){ return gEmptyStackError,nil } return nil,me . items[me . top]} func(me * tarray stack)Iterator()IStackIterator { return newstack Iterator(me)} func(me * tarray stack)String()String { items strings:= make([]String,me .size())for I:= 0;我& lt我。size();i++ { itemStrings[i] = fmt。Sprintf("%v ",me.items[i]) } return fmt。Sprintf("c=%v,t=%v,v=%v,items:%s ",me.capacity,me.top,me.version,Strings.join (itemstrings,","))tstackiteerator.go的免复制堆栈迭代器,实现IStackIterator接口包堆栈导入" errors " type tstackiteerator struct { stack * tarray stack pos int version int 64 } var gNullStackError = errors。New("stack为null ")var gnomoreementerror = errors。new(" no more element ")var gConcurrentModificationError = errors。New("并发修改错误")func newstack iterator(stack * tarray stack)IStackIterator { return & amp;tStackIterator{ stack: stack,pos: -1,version: stack.version,} } func(me * tstack iterator)More()bool { if me . stack = = nil { return false } if me . version!= me . stack . version { return false } return me . pos & lt;me . stack . top } func(me * tstack iterator)Next()(error,interface { }){ if me . stack = = nil { return gNullStackError,nil } if me.version!= me . stack . version { return gConcurrentModificationError,nil } if me.pos & gt= me . stack . top { return gnomoelementerror,nil } me.pos++ return nil,me.stack.items[me.pos]}(end)


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【域名/主机/服务器|】qq邮箱提醒在哪里打开(2024-06-04 18:58)
【技术支持|常见问题】1556原创ng8文章搜索页面不齐(2024-05-01 14:43)
【技术支持|常见问题】1502企业站群-多域名跳转-多模板切换(2024-04-09 12:19)
【技术支持|常见问题】1126完美滑屏版视频只能显示10个(2024-03-29 13:37)
【技术支持|常见问题】响应式自适应代码(2024-03-24 14:23)
【技术支持|常见问题】1126完美滑屏版百度未授权使用地图api怎么办(2024-03-15 07:21)
【技术支持|常见问题】如何集成阿里通信短信接口(2024-02-19 21:48)
【技术支持|常见问题】算命网微信支付宝产品名称年份在哪修改?风水姻缘合婚配对_公司起名占卜八字算命算财运查吉凶源码(2024-01-07 12:27)
【域名/主机/服务器|】帝国CMS安装(2023-08-20 11:31)
【技术支持|常见问题】通过HTTPs测试Mozilla DNS {免费源码}(2022-11-04 10:37)

联系我们
Q Q:375457086
Q Q:526665408
电话:0755-84666665
微信:15999668636
联系客服
企业客服1 企业客服2 联系客服
86-755-84666665
手机版
手机版
扫一扫进手机版
返回顶部