栈
特点:先进后出,后进先出
应用场景:
- 子程序的调用:在跳往子程序前,先将下个指令的地址存储到堆栈中,直到子程序执行完成后再将地址取出,以回到原来的程序中;
- 递归调用:和子程序调用类似,存储下个指令的地址、参数、区域变量等
- 表达式转换(中缀表达式转后缀表达式)与求值(实际解决)
- 二叉树遍历
- 图形的深度优先搜索算法
1. 迷宫问题
1.1 问题描述
- 在一个n*m的迷宫里,每一bai个坐标点有两种可能:0或1,0表示du该位置允许通过,1表示该位置不zhi允许通过
1.2 解法:
package main
import (
"fmt"
)
func main() {
var mazeMap [8][7]int
//1代表墙,0代表路,2代表走过的路
for i := 0; i < len(mazeMap); i++ {
mazeMap[i][0] = 1
mazeMap[i][6] = 1
}
for i := 0; i < len(mazeMap[0]); i++ {
mazeMap[0][i] = 1
mazeMap[7][i] = 1
}
mazeMap[3][1] = 1
mazeMap[3][2] = 1
setWay(&mazeMap, 1, 1)
for i := 0; i < len(mazeMap); i++ {
fmt.Println(mazeMap[i])
}
}
func setWay(mazeMap *[8][7]int, i, j int) (bool) {
//起点mazeMap[1][1],终点mazeMap[6][5]
if mazeMap[6][5] == 2 {
return true
}
if mazeMap[i][j] == 0 {
mazeMap[i][j] = 2
if setWay(mazeMap, i+1, j) {//向下
return true
} else if setWay(mazeMap, i, j+1) {//向右
return true
} else if setWay(mazeMap, i-1, j) {//向上
return true
} else if setWay(mazeMap, i-1, j) { //向左
return true
} else {
mazeMap[i][j] = 3
return false
}
} else {
return false
}
}
2. 八皇后问题
2.1 问题描述:
- 在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法
2.2 解法:
package main
import (
"fmt"
)
var queens [8]int
var count int
func main () {
check(0)
}
//判断该位置是否正确
func judgePos(pos int) bool {
for i := 0; i < pos; i++ {
if queens[i] == queens[pos] || pos - i == queens[pos] - queens[i] || i -pos == queens[pos] - queens[i] {
return false
}
}
return true
}
func check(n int) {
if n == 8 {
count++
fmt.Println(queens)
fmt.Println("第%d种解法", count)
return
}
for i := 0; i < 8; i++ {
queens[n] = i
if judgePos(n) {
check(n + 1)
}
}
}