18-数据结构之队列

34 阅读1分钟

队列

  • 队列是一种先进先出(First-In-First-Out,FIFO)的数据结构。
  • 队列是广度遍历
  • 栈是深度遍历
  • 递归也是深度遍历
package Queue

type MyQueue interface {
    Size()int//大小
    Front() interface{}//第一个元素
    End() interface{}//最后一个元素
    IsEmpty() bool//是否为空队列
    EnQueue(data interface{})//入队
    DeQueue() interface{}//出队
    Clear()//清空
}

type Queue struct {
    dataStore []interface{}//队列的数据存储
    theSize int//队列的大小
}

func NewQueue()* Queue {
    myQueue := new(Queue)//初始化开辟结构体
    myQueue.dataStore = make([]interface{}, 0)
    myQueue.theSize = 0
    return myQueue
}
//大小
func(myq *Queue) Size()int{
    return myq.theSize
}
//第一个元素
func(myq *Queue)Front() interface{}{
    if myq.Size() == 0 {
        return nil
    }
    return myq.dataStore[0]
}
//最后一个元素
func(myq *Queue)End() interface{}{
    if myq.Size() == 0 {
        return nil
    }
    return myq.dataStore[myq.Size() - 1]
}
//是否为空队列
func(myq *Queue)IsEmpty() bool{
    return myq.theSize == 0
}
//入队
func(myq *Queue)EnQueue(data interface{}){
    myq.dataStore = append(myq.dataStore, data)//入队
    myq.theSize++
}
//出队
func(myq *Queue)DeQueue() interface{}{
    if myq.Size() == 0 {
        return nil
    }
    data := myq.dataStore[0]
    if myq.Size() > 1 {
        // 去掉第一项
        myq.dataStore = myq.dataStore[1:myq.Size()]
    } else {
        myq.dataStore = make([]interface{}, 0)
    }
    myq.theSize--
    return data
}
//清空
func(myq *Queue)Clear(){
    myq.dataStore = make([]interface{}, 0)
    myq.theSize = 0
}
  • 使用
package main
import (
    "godemo01/Queue"
    "fmt"
)

func main() {
    myq := Queue.NewQueue()
    myq.EnQueue(1)
    myq.EnQueue(2)
    myq.EnQueue(3)
    myq.EnQueue(4)
    fmt.Println(myq.DeQueue())// 1
    fmt.Println(myq.DeQueue())// 2
    fmt.Println(myq.DeQueue())// 3
    fmt.Println(myq.Size())// 1
    fmt.Println(myq.IsEmpty())// false
}
  • 遍历ceshi文件
package main
import (
    // "godemo01/ArrayList"
    // "godemo01/StackArray"
    "godemo01/Queue"
    "fmt"
    // "errors"
    "io/ioutil"
)

func main() {
    myq := Queue.NewQueue()
    path := "D:\\桌面程序\\ceshi"
    files := []string{}
    myq.EnQueue(path)

    for ;; {
        path := myq.DeQueue()//不断从队列中取出数据
        if path == nil {
            break
        }
        read, _ := ioutil.ReadDir(path. (string))//读取文件夹下的所有内容
        for _, fi := range read {
            if fi.IsDir() {
                fullDir := path. (string) + "\\" +fi.Name()//拼接下一级文件夹名称
                files = append(files, fullDir)// 追加路径
                myq.EnQueue(fullDir)
            } else {
                fullDir := path. (string) + "\\" +fi.Name()//拼接下一级文件夹名称
                files = append(files, fullDir)// 追加路径
            }
        }
    }

    for i := 0; i < len(files); i++ {
        fmt.Println(files[i])
    }
}

image.png