Go语言实战案例-自定义栈结构
以下是《Go语言100个实战案例》中的 数据结构与算法篇 - 案例23:自定义栈结构 的完整内容,帮助初学者通过自定义结构体来实现栈的数据结构。
🎯 案例目标
实现一个自定义的栈结构,并提供常见的栈操作:压栈(Push)、弹栈(Pop)、查看栈顶元素(Peek)和判断栈是否为空(IsEmpty)。
🧩 应用场景
- • 栈结构是计算机科学中常用的数据结构,用于处理函数调用、括号匹配、表达式求值等问题。
- • 在 Go 语言中,可以通过结构体来定义栈,并实现各种栈操作。
- • 初学者可以通过此案例深入理解栈的工作原理,并练习使用结构体和切片(slice)来实现栈。
🧠 涉及知识点
- • 使用结构体定义栈(Stack)
- • 栈操作的基本方法(Push、Pop、Peek、IsEmpty)
- • 使用 Go 的切片(slice)动态调整栈大小
💻 示例代码:自定义栈结构
package mainimport \"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{}
存储任何类型的数据📤 示例运行
栈的大小: 3栈顶元素: 30弹出的元素: 30弹栈后的栈的大小: 2新的栈顶元素: 20弹出的元素: 20弹出的元素: 10
🧪 拓展练习
- • 栈的扩展:实现一个支持栈的最大值(或最小值)跟踪功能,即每次
Push
时,栈顶同时保存当前最大(或最小)值。 - • 栈的应用:
- • 用栈来实现括号匹配检查,确保每个
(
都有相应的)
; - • 用栈解决计算机表达式求值问题(如逆波兰表达式计算)。
- • 用栈来实现括号匹配检查,确保每个
- • 线程安全:考虑使用 Go 的并发机制(如
sync.Mutex
)来实现线程安全的栈操作,适用于多线程环境。
✅ 小结
通过本案例,你实现了一个自定义栈结构,并掌握了 map
、interface{}
和 Go 语言切片等核心概念。栈是一个非常重要的数据结构,在编程中有着广泛的应用,尤其是在解析、计算和回溯等场景中。