- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
05.8.1 Go 语言实现栈
Go 语言实现栈
现在是时候看看如何使用 Go 语言实现栈了。相关的细节在 stack.go
源文件中。同样,栈的实现也会用到链表。如你所知,你需要两个函数:一个 Push()
函数将元素放入栈中,一个 Pop()
函数从栈中删除元素。单独使用一个变量保存栈中元素的数量是个很实用的方法,这样即使不访问链表也能判断栈是否为空,不过这不是必须的。
stack.go
中的源代码将分四个部分介绍。第一部分如下:
package main
import (
"fmt"
)
type Node struct {
Value int
Next *Node
}
var size = 0
var stack = new(Node)
stack.go
的第二部分包含了 Push()
函数的实现:
func Push(v int) bool {
if stack == nil {
stack = &Node{v, nil}
size = 1
return true
}
temp := &Node{v, nil}
temp.Next = stack
stack = temp
size++
return true
}
如果栈为空就创建一个新节点(temp
)并将它放在当前栈的最前面,然后新节点会成为栈的头节点。这个版本的 Push()
函数永远返回 true
。对于存储空间有限的栈,你可以修改一下,在栈将要溢出时返回 false
。
第三部分包含 Pop()
函数的实现:
func Pop(t *Node) (int, bool) {
if size == 0 {
return 0, false
}
if size == 1 {
size = 0
stack = nil
return t.Value, true
}
stack = stack.Next
size--
return t.Value, true
}
stack.go
的第四个代码段如下:
func traverse(t *Node) {
if size == 0 {
fmt.Println("Empty Stack!")
return
}
for t != nil {
fmt.Printf("%d -> ", t.Value)
t = t.Next
}
fmt.Println()
}
由于这里的栈是使用链表实现的,所以也用链表的方式进行遍历。
stack.go
的最后一部分如下:
func main() {
stack = nil
v, b := Pop(stack)
if b {
fmt.Print(v, " ")
} else {
fmt.Println("Pop() failed!")
}
Push(100)
traverse(stack)
Push(200)
traverse(stack)
for i := 0; i < 10; i++ {
Push(i)
}
for i := 0; i < 15; i++ {
v, b := Pop(stack)
if b {
fmt.Print(v, " ")
} else {
break
}
}
fmt.Println()
traverse(stack)
}
如你所见,stack.go
的源代码比 queue.go
的稍微短一点,这主要是因为栈背后的思想比队列更简单。
执行 stack.go
将生成如下输出:
Pop() failed!
100 ->
200 -> 100 ->
9 8 7 6 5 4 3 2 1 0 200 100
Empty Stack!
现在为止,你已经知道了如何使用链表实现哈希表、队列和栈。这些例子会让你意识到,在一般情况下链表对于编程和计算机科学来说是多么的有效和重要!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论