美文网首页
数据结构: Go 链表实现队列

数据结构: Go 链表实现队列

作者: 沙漠中的猴 | 来源:发表于2018-11-26 14:11 被阅读0次

队列的特点

  • 只允许一端进行插入,而另一端进行删除的线性表。
  • 遵从 先入先出 原则

队列的抽象数据类型

Data

元素具有相同的类型,相邻元素具有前驱和后继

操作

  • 初始化
  • 清空
  • 添加元素
  • 删除元素
  • 队列长度

代码

package main

import "fmt"

/*
   我们用单链表来实现队列的功能。
   头指针指向 队列的第一个元素。
   尾指针指向 队列的最后一个元素。
*/
type Element interface{}

type Node struct {
    Data Element
    Next *Node
}

type Queue struct {
    Head   *Node
    Tail   *Node
    Length int
}

// 创建一个栈
func Create() *Queue {
    head := &Node{Data: nil, Next: nil}
    tail := &Node{Data: nil, Next: nil}

    return &Queue{Head: head, Tail: tail, Length: 0}
}

// 返回栈的长度
func (q *Queue) Len() int {
    return q.Length
}

// 判断栈是否为空
func (q *Queue) IsEmpty() bool {
    if q.Len() == 0 {
        return true
    }
    return false
}

// 打印栈元素
func (q *Queue) Print() {
    if q.IsEmpty() {
        fmt.Println("queue is empty")
    }

    p := q.Head.Next
    iNode := 1
    for p != nil {
        fmt.Printf("iNode == %#v,Data == %#v\n", iNode, p.Data)
        iNode++
        p = p.Next
    }

    return
}

// 向栈内添加元素
func (q *Queue) Append(e Element) {
    node := &Node{Data: e, Next: nil}
    // 如果为空
    if q.IsEmpty() {
        q.Head.Next = node
        q.Tail.Next = node
        q.Length++

        return
    }

    // 让最后一个节点的 Next 指向 新的节点
    q.Tail.Next.Next = node
    // 尾节点指向 新的节点
    q.Tail.Next = node
    q.Length++

    return
}

// 删除元素,出队列
func (q *Queue) Delete() {
    if q.IsEmpty() {
        fmt.Println("queue is empty")

        return
    }

    if q.Len() == 1 {
        q.Head.Next = nil
        q.Tail.Next = nil
        q.Length--

        return
    }

    q.Head.Next = q.Head.Next.Next
    q.Length--

    return
}

// 清空队列
func (q *Queue) Clear() {
    if q.IsEmpty() {
        fmt.Println("queue is empty")

        return
    }

    q.Head.Next = nil
    q.Tail.Next = nil
    q.Length = 0

    return
}

func main() {
    q := Create()

    q.Append(1)
    q.Append(1)
    q.Append(1)
    q.Append(1)
    q.Append(1)

    q.Delete()
    q.Clear()
    q.Print()
    fmt.Println(q.Len())
}

相关文章

  • 数据结构: Go 链表实现队列

    队列的特点 只允许一端进行插入,而另一端进行删除的线性表。 遵从 先入先出 原则 队列的抽象数据类型 Data 元...

  • c++ 实现队列

    相关资料: 用C++实现一个队列 数据结构代码实现之队列的链表实现(C/C++)

  • 数据结构基础2

    1.单链表的数据结构+案例2.双链表的数据结构+案例3.栈的数据结构(双向链表+数组实现) + 案例4.队列的数据...

  • 2017.5.25

    lua学习总结:数据结构: 使用Lua实现链表(单向链表和双向链表),队列 使用Lua保存图,用table保存,每...

  • 队列

    2018年10月31日 队列是一种先进先出(FIFO)的数据结构 1,队列的链表实现 2,队列的数组实现 3,队列...

  • LinkedList

    实现: 基于链表的数据结构实现,实现了List和Deque接口,有List和队列的特性,底层实现是一个双端链表,内...

  • ARTS-第三周

    Algorithm 这周实现了最基本的动态数据结构链表,并用数组和链表分别实现了栈和队列。 git代码地址 数组和...

  • 集合知识点整理

    1.前言:数据结构——队列 队列接口先说明有哪些功能,但不说是如何实现的,队列有两种实现方式: 循环数组 链表 循...

  • Go语言小技巧(4) - FIFO队列

    Go语言小技巧(4) - FIFO队列 队列是非常常见的数据结构,看下K8S是怎么实现的 详见client-go\...

  • 队列(链表实现)

    基于链表数据结构实现Queue,将队列表示为一条从最早插入的元素到最近插入的元素的链表,实例变量first指向队列...

网友评论

      本文标题:数据结构: Go 链表实现队列

      本文链接:https://www.haomeiwen.com/subject/fywjqqtx.html