分享
  1. 首页
  2. 文章

Go 中 Queue 的实现方式

allenwu.itscoder.com · · 6883 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

需求

队列的特性较为单一,基本操作即初始化、获取大小、添加元素、移除元素等。最重要的特性就是满足先进先出。

实现

接下来还是按照以前的套路,一步一步来分析如何利用Go的语法特性实现Queue这种数据结构。

定义

首先定义每个节点Node结构体,照例Value的值类型可以是任意类型,节点的前后指针域指针类型为node

typenodestruct{valueinterface{}prev*nodenext*node}

继续定义链表结构,定义出头结点和尾节点的指针,同时定义队列大小size:

typeLinkedQueuestruct{head*nodetail*nodesizeint}

大小

获取队列大小,只需要获取LinkedQueue中的size大小即可:

func(queue*LinkedQueue)Size()int{returnqueue.size}

Peek

Peek操作只需要获取队列队头的元素即可,不用删除。返回类型是任意类型,用接口实现即可。另外如果head指针域为nil,则需要用panic抛出异常,一切ok的话,返回队头节点的数值即可:

func(queue*LinkedQueue)Peek()interface{}{ifqueue.head==nil{panic("Empty queue.")}returnqueue.head.value}

添加

添加操作在队列中是比较重要的操作,也要区分队尾节点是否为nil,根据是否为nil,执行不同的连接操作,最后队列的size要加1,为了不浪费内存新增节点的指针变量要置nil:

func(queue*LinkedQueue)Add(valueinterface{}){new_node:=&node{value,queue.tail,nil}ifqueue.tail==nil{queue.head=new_nodequeue.tail=new_node}else{queue.tail.next=new_nodequeue.tail=new_node}queue.size++new_node=nil}

移除

队列的删除操作也是很简单,无非是节点的断开操作。在此之前,需要判断链表的状态即是否为nil?而后移除的队列最前端的节点,先用一个新的变量节点保存队列前面的节点,进行一系列操作之后,至nil,并将长度减少即可。

func(queue*LinkedQueue)Remove(){ifqueue.head==nil{panic("Empty queue.")}first_node:=queue.headqueue.head=first_node.nextfirst_node.next=nilfirst_node.value=nilqueue.size--first_node=nil}

Ok,以上就是用Go的基本语法特性实现Queue的过程。谢谢阅读!!!


有疑问加站长微信联系(非本文作者)

本文来自:allenwu.itscoder.com

感谢作者:allenwu.itscoder.com

查看原文:Go 中 Queue 的实现方式

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
6883 次点击 ∙ 1 赞
1 回复 | 直到 2018年12月28日 13:26:59
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏