17-数据结构之栈的应用

41 阅读2分钟

栈模拟低级递归

  • 关联上一章内容,实现 数字的累加
  • 类型断言的处理
package main
import (
    "godemo01/ArrayList"
    // "godemo01/StackArray"
    "fmt"
)

// 累加函数
func Add(num int) int{
    if num == 0 {
        return 0
    }else {
        return num + Add(num - 1)
    }
}
func main() {
   // 递归的方式
    fmt.Println(Add(5))// 15

    // 所有的递归都能转化成循环加栈
    myStack := ArrayList.NewArrayListStackX()
    myStack.Push(5)
    last := 0// 保存结果
    for !myStack.IsEmpty() {
        data := myStack.Pop()//取出数据
        if data == nil {
            break
        }
        if data == 0 {
            last += 0
        }else {
            last += data. (int)	//**类型断言**
            myStack.Push((data. (int) - 1))
        }
    } 
    fmt.Println(last)
}

斐波拉契数列递归模拟

package main
import (
    "godemo01/ArrayList"
    "fmt"
)

// 斐波拉契递归函数
func FB(num int) int {
    if num == 1 || num == 2{
        return 1
    }
    return FB(num - 1) + FB(num - 2)
}
func main() {
    // 递归的方式
    fmt.Println(FB(6))

    // 栈模拟
    myStack := ArrayList.NewArrayListStackX()
    myStack.Push(7)
    last := 0
    for !myStack.IsEmpty() {
        data := myStack.Pop()//取出数据
        if data == 1 || data == 2 {
            last += 1
        }else {
            myStack.Push(data. (int) - 1)
            myStack.Push(data. (int) - 2)
        }
    }
    fmt.Println(last)// 13
}

栈实现文件夹遍历

package main
import (
    // "godemo01/ArrayList"
    "fmt"
    "errors"
    "io/ioutil"
)

func GetAll(path string, files[]string)([]string, error) {
    read, err := ioutil.ReadDir(path)//读取文件夹
    if err != nil {
        return files, errors.New("文件夹不可读取")
    }
    for _,fi:= range read {//循环遍历每个文件或者文件夹
        if fi.IsDir() {//判断是否文件夹
            fullDir := path + "\\" +fi.Name()//拼接下一级文件夹名称
            files = append(files, fullDir)// 追加路径
            files, _ = GetAll(fullDir, files)//文件递归处理
        }else {
            fullDir := path + "\\" +fi.Name()//拼接下一级文件夹名称
            files = append(files, fullDir)// 追加路径
        }
    }
    return files, nil
}

func main() {
    // 递归的方式
    path := "D:\\桌面程序\\ceshi"//路径
    files := []string{}
    files,_ = GetAll(path, files)//抓取文件
    for i := 0; i < len(files); i++ {
        fmt.Println(files[i])
    }
}

image.png

栈模拟遍历文件

package main
import (
    "godemo01/StackArray"
    "fmt"
    "io/ioutil"
)

func main() {
    myStack := StackArray.NewStack()
    path := "D:\\桌面程序\\ceshi"
    files := []string{}
    myStack.Push(path)

    for !myStack.IsEmpty() {
    path := myStack.Pop(). (string)
    files = append(files, path)//加入列表
    read, _ := ioutil.ReadDir(path)//读取文件夹下的所有内容
    for _, fi := range read {
        if fi.IsDir() {
            fullDir := path + "\\" +fi.Name()//拼接下一级文件夹名称
            myStack.Push(fullDir)
        } else {
            fullDir := path + "\\" +fi.Name()//拼接下一级文件夹名称
            files = append(files, fullDir)// 追加路径
        }
    }
    for i := 0; i < len(files); i++ {
        fmt.Println(files[i])
    }
}

image.png