zoukankan      html  css  js  c++  java
  • chapter11_2 Lua链表与队列

    链表

      由于table是动态的实体,所以在Lua中实现链表是很方便的。每个节点以一个table来表示,一个“链表”只是节点table中的一个字段。

    该字段包含了对其他table的引用。例如,要实现一个基础的列表,其中每个节点具有两个字段:next和value

    创建一个链表

    list = nil
    list = {next = list,value = v}
    --遍历此链表
    local l = list
    while l do
        <访问 l.value >
        l = l.next
    end

    也可以参考之前的一篇文章Chapter7 迭代器 中的 3、无状态的迭代器 里的例子,实现了链表的初始化和遍历。

    至于其他类型的列表,例如双向链表或环形表,都可以使用相同的方法实现。

    然而,在Lua中很少需要这类的结构,因为通常存在着一些更简单的方式来表示数据。

    例如可以通过一个(几乎无限大的)数组来表示一个栈。

    队列与双向队列

      在Lua中实现队列的一种简单方法是使用table库的函数insert和remove。这两个函数可以在一个数组的任意位置插入或删除元素。

    并且根据操作要求移动后续元素。对于较大的结构,移动的开销是很大的。

    一个高效的实现是使用两个索引,分别用于首尾的两个元素:

    function ListNew()
        return {first = 0,last = -1}
    end

    为了避免污染全局名称空间,将在一个table内部定义所有的队列操作,这个table且称为List,将上例重写:

    List = {}
    function List.new()
        return {first = 0,last = -1} --这里没有看懂,为什么这样初始化?是为了下面popfirst操作中的first>last 的判断 为false,表示空队列吗?以后再深入了解
    end

    现在可以在常量时间内完成在两端插入或删除元素了(以下函数有点像操作Lua栈,first索引表示栈底,last表示栈顶,先这样理解吧,以后弄明白了再回来修改):

    function List.pushfirst(list  , value)
        local first = list.first - 1    --从头push后,就要让头往下涨1
        list.first = first                --表示list["first"] = first
        list[first] = value               --表示first这个变量在表中的值,这两者容易搞混
    end
    
    function List.pushlast(list, value)
        local last = list.last + 1    --push后,last就要往上增长1
        list.last = last
        list[last] = value
    end
    
    function List.popfirst(list)
        local first = list.first
        if first > list.last then error("list is empty") end
        local value = list[first]
        list[first] = nil            --允许垃圾回收
        list.first = first + 1    --弹出后,first就要往上加1
        return value
    end
    
    function List.poplast(list)
        local last = list.last
        if list.first > last then error("list is empty") end
        local value = list[last]
        list[last] = nil            --允许垃圾回收
        list.last = last - 1     --弹出后,,last就要往下减1
        return value
    end

    如果希望该结构能严格地遵循队列的操作规范,那么只调用pushlast和popfirst就可以了。

  • 相关阅读:
    zbb20171108 一台电脑启动多个 tomcat
    zbb20171101 oracle 启动 linux
    zbb20171017 svn Cleanup failed to process the following paths错误的解决
    zbb20171013 mysql服务重启 重启服务 重启mysql服务
    zbb20171013 mysql 远程连接 报错 1130-host ... is not allowed to connect to this MySql server
    zbb20171013 svnserver 修改默认端口
    zbb20171013 tomcat 设置访问ip地址直接访问项目
    zbb20171013 Windows 下端口占用 查询 以及结束进程的方法
    20171012 nginx 超时时间配置
    20171012 tomcat 超时时间配置
  • 原文地址:https://www.cnblogs.com/daiker/p/5830301.html
Copyright © 2011-2022 走看看