Go语言实战案例-自定义栈结构

以下是《Go语言100个实战案例》中的 数据结构与算法篇 - 案例23:自定义栈结构 的完整内容,帮助初学者通过自定义结构体来实现栈的数据结构。

🎯 案例目标

实现一个自定义的栈结构,并提供常见的栈操作:压栈(Push)、弹栈(Pop)、查看栈顶元素(Peek)和判断栈是否为空(IsEmpty)。


🧩 应用场景

  • • 栈结构是计算机科学中常用的数据结构,用于处理函数调用、括号匹配、表达式求值等问题。
  • • 在 Go 语言中,可以通过结构体来定义栈,并实现各种栈操作。
  • • 初学者可以通过此案例深入理解栈的工作原理,并练习使用结构体和切片(slice)来实现栈。

🧠 涉及知识点

  • • 使用结构体定义栈(Stack)
  • • 栈操作的基本方法(Push、Pop、Peek、IsEmpty)
  • • 使用 Go 的切片(slice)动态调整栈大小

💻 示例代码:自定义栈结构

go 复制代码
package main

import "fmt"

// 定义栈结构体
type Stack struct {
    elements []interface{} // 用切片存储栈元素
}

// 创建一个新的栈
func NewStack() *Stack {
    return &Stack{}
}

// 判断栈是否为空
func (s *Stack) IsEmpty() bool {
    return len(s.elements) == 0
}

// 获取栈的大小
func (s *Stack) Size() int {
    return len(s.elements)
}

// 压栈操作
func (s *Stack) Push(item interface{}) {
    s.elements = append(s.elements, item)
}

// 弹栈操作
func (s *Stack) Pop() (interface{}, bool) {
    if s.IsEmpty() {
        return nil, false // 栈为空,返回错误
    }
    // 获取栈顶元素并移除
    topIndex := len(s.elements) - 1
    item := s.elements[topIndex]
    s.elements = s.elements[:topIndex]
    return item, true
}

// 查看栈顶元素
func (s *Stack) Peek() (interface{}, bool) {
    if s.IsEmpty() {
        return nil, false // 栈为空,返回错误
    }
    return s.elements[len(s.elements)-1], true
}

func main() {
    stack := NewStack() // 创建一个栈

    // 测试压栈操作
    stack.Push(10)
    stack.Push(20)
    stack.Push(30)
    fmt.Println("栈的大小:", stack.Size()) // 输出栈的大小

    // 查看栈顶元素
    top, _ := stack.Peek()
    fmt.Println("栈顶元素:", top)

    // 测试弹栈操作
    item, _ := stack.Pop()
    fmt.Println("弹出的元素:", item)
    fmt.Println("弹栈后的栈的大小:", stack.Size())

    // 再次查看栈顶元素
    top, _ = stack.Peek()
    fmt.Println("新的栈顶元素:", top)

    // 弹栈直到栈空
    for !stack.IsEmpty() {
        item, _ = stack.Pop()
        fmt.Println("弹出的元素:", item)
    }
}

🛠 技术说明

功能 使用方法
定义栈结构体 type Stack struct { elements []interface{} }
栈操作方法 Push、Pop、Peek、IsEmpty
切片操作 append、切片截取 s.elements[:topIndex]
空值检查 IsEmpty 判断栈是否为空
多种数据类型存储 使用 interface{} 存储任何类型的数据

📤 示例运行

makefile 复制代码
栈的大小: 3
栈顶元素: 30
弹出的元素: 30
弹栈后的栈的大小: 2
新的栈顶元素: 20
弹出的元素: 20
弹出的元素: 10

🧪 拓展练习

  • • 栈的扩展 :实现一个支持栈的最大值(或最小值)跟踪功能,即每次 Push 时,栈顶同时保存当前最大(或最小)值。
  • • 栈的应用:
    • • 用栈来实现括号匹配检查,确保每个 ( 都有相应的 );
    • • 用栈解决计算机表达式求值问题(如逆波兰表达式计算)。
  • • 线程安全 :考虑使用 Go 的并发机制(如 sync.Mutex)来实现线程安全的栈操作,适用于多线程环境。

✅ 小结

通过本案例,你实现了一个自定义栈结构,并掌握了 map、interface{} 和 Go 语言切片等核心概念。栈是一个非常重要的数据结构,在编程中有着广泛的应用,尤其是在解析、计算和回溯等场景中。

相关推荐
ZhengEnCi10 小时前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
王中阳Go10 小时前
后端转 Agent 岗面试怎么答:8 个高频问题与应答口径
人工智能·后端·python·大语言模型
程序猿DD11 小时前
OctaFuse Gateway 2.18.0:MCP 接入支持 OAuth,供应商粘性绑定可视化管理
后端
ZhengEnCi12 小时前
Agent 规则管理:让 Memory 做索引、让 Skill 存规则——上下文上限实测与分工方案
后端
nice_lcj52013 小时前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试
骑着蜗牛撵大象32713 小时前
2026 后端 AI 工程化:Spring AI 管调用、MCP 管工具、Agent 内嵌管自治
java·人工智能·后端·spring·ai·可观测性·mcp
摸爬滚打的小李14 小时前
Spring XML + WAR + Tomcat 项目启动
后端
IT_陈寒15 小时前
SpringBoot自动配置的坑,这次终于爬出来了
前端·人工智能·后端
RainbowFish15 小时前
# RAG 与智能体记忆:从原理到工程实践 > 一篇给学习者的总结。
后端
苏三说技术15 小时前
为什么越来越多人用Arthas 4 ?
后端