【问题标题】:LIFO container in GoGo 中的 LIFO 容器
【发布时间】:2013-06-30 09:03:25
【问题描述】:

我需要使用 LIFO 堆栈容器进行推送和弹出操作,但 container 包没有。它应该由每个程序员临时编写,还是有办法使用其他数据结构作为堆栈(如 python 中的列表)?

【问题讨论】:

标签: go


【解决方案1】:

Go 或标准库中没有内置的堆栈类型。但是,您可以非常简单地将 Push 和 Pop 方法添加到切片中(与 python 中列表上的现有方法不同)。

type Stack []YourType

func (s *Stack) Push(v YourType) {
    *s = append(*s, v)
}

func (s *Stack) Pop() YourType {
    ret := (*s)[len(*s)-1]
    *s = (*s)[0:len(*s)-1]
    return ret
}

很简单

【讨论】:

  • 但只是部分答案。
  • @nemo 我觉得没什么可说的,除了对切片/指针语义的过度解释之外。
  • 嗯,我本来期待像 yes you have to implement it yourself. For example: .... 这样的东西。仅仅发布代码就意味着根本没有阅读问题而只是乱扔代码。但也许这只是我
  • 看我的回复,你的代码不好,append很慢,pop后不会释放堆内存,使用容器/列表更好
【解决方案2】:

标准库中没有 container 包。然而,LIFO 只是一个堆栈,它很容易通过例如切片来建模。因此没有 stdlib LIFO 容器。

【讨论】:

  • @Lazin:那不是一个包。
【解决方案3】:

stack是list的一个子集,golang有container/list库,实现stack很简单,这里举个例子。

//last in first out
    stack := list.New()
    //stack push use PushBack
    for i:=0;i<100;i++ {
        stack.PushBack(i)
    }
    //stack get top use stack.Back()
    //stack pop use stack.Remove(stack.Back())
    //stack isEmpty use stack.Back() == nil 
    for stack.Back()!=nil {
        fmt.Println(stack.Back().Value)
        stack.Remove(stack.Back())
    }

【讨论】:

    猜你喜欢
    • 2020-09-16
    • 2011-05-09
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 2017-04-18
    • 2018-11-04
    • 2020-08-17
    相关资源
    最近更新 更多