Go 语言入门很简单 -- 数据结构篇:Go 实现栈 #私藏项目实操分享#

简介: Go 语言入门很简单 -- 数据结构篇:Go 实现栈 #私藏项目实操分享#

什么是栈

类似于链表,栈是一种简单的数据结构。在栈中,数据的取值顺序非常重要。栈有点像洗碟子然后堆碟子,最先洗的一定是最上面的碟子,然后洗干净后,放到碟子的最下面。第一个放好的碟子永远是最后一个被取用的。

栈是一种插入和删除总在一端的有序列表,最后插入的元素时总是第一个被删除的元素,这种特征也被称为 Last in First out(LIFO)或者 First in Last out(FILO)。

入栈的操作叫做 push ;

出栈的操作叫做 pop 。

往一个满栈里插入元素叫做 栈溢出;

栈的方法

push(e): Add e at the top of the (implicit) stack
pop(): Remove and return the top element of the stack
empty(): Return the Boolean value true just in case the stack is empty.
top(): Return the top element of that stack without removing it.

栈的结构

type Stack interface {
    containers.Container
    Push(e interface{})
    Pop() (interface{}, error)
    Top() (interface{}, error)        
}

栈的数组实现

import "errors"
type ArrayStack struct {
    store []interface{}
}
func (s *ArrayStack) Size() int {
    return len(s.store)
}
func (s *ArrayStack) Empty() bool {
    return len(s.store) == 0
}
func (s *ArrayStack) Clear() {
    s.store = make([]interface{}, 0, 10)
}
func (s *ArrayStack) Push(e interface{}) {
    s.store = append(s.store, e)
}
func (s *ArrayStack) Pop() (interface{}, err) {
    if len(s.store) == 0 {
        return nil, errors.New("Pop: the stack cannot be empty")
    }
    result := s.store[len(s.store)-1]
    s.store = s.store[:len(s.store)-1]
    return result, nil
}
func (s *ArrayStack) Top() (interface{}, error) {
    if len(s.store) == 0 {
        return nil, errors.New("Top: stack cannot be empty")
    }
    return s.store[len(s.store)-1], nil
}

栈的链表实现

import "errors"
type ArrayStack struct {
    store []interface{}
}
func (s *ArrayStack) Size() int {
    return len(s.store)
}
func (s *ArrayStack) Empty() bool {
    return len(s.store) == 0
}
func (s *ArrayStack) Clear() {
    s.store = make([]interface{}, 0, 10)
}
func (s *ArrayStack) Push(e interface{}) {
    s.store = append(s.store, e)
}
func (s *ArrayStack) Pop() (interface{}, err) {
    if len(s.store) == 0 {
        return nil, errors.New("Pop: the stack cannot be empty")
    }
    result := s.store[len(s.store)-1]
    s.store = s.store[:len(s.store)-1]
    return result, nil
}
func (s *ArrayStack) Top() (interface{}, error) {
    if len(s.store) == 0 {
        return nil, errors.New("Top: stack cannot be empty")
    }
    return s.store[len(s.store)-1], nil
}
type LinkedStack struct{
    topPtr *node
    count int
}
func (s *LinkedStack) Size() int {
    return s.count
}
func (s *LinkedStack) Empty() bool {
    return s.count == 0
}
func (s *LinkedStack) Clear() {
    s.count = 0
    s.topPtr = nil
}
func (s *LinkedStack) Push(e interface{}) {
    s.topPtr = &node{e, s.topPtr}
    s.count++
}
func (s *LinkedStack) Pop() (interface{}, error) {
    if s.count == 0 {
        return nil, errors.New("Pop: the stack cannot be empty")
    }
    result := s.topPtr.item
    s.topPtr = s.topPtr.next
    s.count--
    return result, nil
}
func (s *LinkedStack) Top() (interface{}, error)  {
    if s.count == 0 {
        return nil, errors.New("Pop: the stack cannot be empty")
    }
    result s.topPtr.item, nil
}
相关文章
|
6天前
|
存储 JSON 监控
Viper,一个Go语言配置管理神器!
Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
23 2
|
4天前
|
Go 索引
go语言中的循环语句
【11月更文挑战第4天】
13 2
|
4天前
|
Go C++
go语言中的条件语句
【11月更文挑战第4天】
15 2
|
4天前
|
Go
go语言中的 跳转语句
【11月更文挑战第4天】
12 4
|
4天前
|
JSON 安全 Go
Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
17 1
【Go语言入门100题】026 I Love GPLT (5 分) Go语言 | Golang
L1-026 I Love GPLT (5 分) Go语言|Golang 这道超级简单的题目没有任何输入。 你只需要把这句很重要的话 —— “I Love GPLT”——竖着输出就可以了。 所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车。
602 0
|
存储 Go
【Go语言入门100题】023 输出GPLT (20 分) Go语言 | Golang
L1-023 输出GPLT (20 分) Go语言|Golang 给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT的顺序打印,直到所有字符都被输出。 下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。
166 0
|
10天前
|
JavaScript Java Go
探索Go语言在微服务架构中的优势
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出。本文将深入探讨Go语言在构建微服务时的性能优势,包括其在内存管理、网络编程、并发模型以及工具链支持方面的特点。通过对比其他流行语言,我们将揭示Go语言如何成为微服务架构中的一股清流。
|
9天前
|
Ubuntu 编译器 Linux
go语言中SQLite3驱动安装
【11月更文挑战第2天】
31 7
|
9天前
|
关系型数据库 Go 网络安全
go语言中PostgreSQL驱动安装
【11月更文挑战第2天】
38 5

热门文章

最新文章