引言
在编程的世界里,数据结构是构建高效程序的基础。Golang(又称Go语言)以其简洁、高效和并发特性受到越来越多开发者的喜爱。本文将带领大家通过实战案例,轻松掌握Golang中的链表、栈、队列等常用数据结构。
链表
什么是链表?
链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
Golang中的链表实现
package main
import "fmt"
type ListNode struct {
Val int
Next *ListNode
}
func createList(values []int) *ListNode {
head := &ListNode{Val: values[0]}
current := head
for _, val := range values[1:] {
current.Next = &ListNode{Val: val}
current = current.Next
}
return head
}
func printList(head *ListNode) {
for current := head; current != nil; current = current.Next {
fmt.Printf("%d ", current.Val)
}
fmt.Println()
}
func main() {
list := createList([]int{1, 2, 3, 4, 5})
printList(list)
}
链表的应用案例
- 单链表反转
- 删除链表中的倒数第n个节点
栈
什么是栈?
栈是一种后进先出(LIFO)的数据结构,类似于一个盘子堆叠。
Golang中的栈实现
package main
import "fmt"
type Stack struct {
items []int
}
func (s *Stack) Push(val int) {
s.items = append(s.items, val)
}
func (s *Stack) Pop() int {
if len(s.items) == 0 {
panic("Stack is empty")
}
val := s.items[len(s.items)-1]
s.items = s.items[:len(s.items)-1]
return val
}
func (s *Stack) Peek() int {
if len(s.items) == 0 {
panic("Stack is empty")
}
return s.items[len(s.items)-1]
}
func main() {
stack := Stack{}
stack.Push(1)
stack.Push(2)
stack.Push(3)
fmt.Println(stack.Pop()) // 输出 3
fmt.Println(stack.Peek()) // 输出 2
}
栈的应用案例
- 函数调用栈
- 括号匹配
队列
什么是队列?
队列是一种先进先出(FIFO)的数据结构,类似于排队买票。
Golang中的队列实现
package main
import "fmt"
type Queue struct {
items []int
}
func (q *Queue) Enqueue(val int) {
q.items = append(q.items, val)
}
func (q *Queue) Dequeue() int {
if len(q.items) == 0 {
panic("Queue is empty")
}
val := q.items[0]
q.items = q.items[1:]
return val
}
func (q *Queue) Peek() int {
if len(q.items) == 0 {
panic("Queue is empty")
}
return q.items[0]
}
func main() {
queue := Queue{}
queue.Enqueue(1)
queue.Enqueue(2)
queue.Enqueue(3)
fmt.Println(queue.Dequeue()) // 输出 1
fmt.Println(queue.Peek()) // 输出 2
}
队列的应用案例
- 打印任务队列
- 缓冲区管理
总结
通过本文的实战案例,相信你已经对Golang中的链表、栈、队列等常用数据结构有了更深入的了解。在实际开发中,合理运用这些数据结构可以提高程序的性能和可读性。祝你在编程的道路上越走越远!
