zoukankan      html  css  js  c++  java
  • 《Programming in Lua 3》读书笔记(九)

    PartⅠ 已经看完了,然后进入了partⅡ阶段了。


    日期:2014.7.6
    Part Ⅱ 11
    Data Structures
    Lua中的数据结构都是以table实现的
    队列
    List = {}
    function List.new()
         return { first = 0, last = -1}
    end

    Lua实现push/pop 操作
    push
    function List.pushfirst(list,value)
         local first = list.first - 1
         list.first = first
         list[first] = value
    end

    function List.pushlast(list,value)
         local last = list.last + 1
         list.last = last
         list[last] = value
    end

    pop
    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
         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
         return value
    end
    可以看到pop、push操作都是对table的键进行加减-赋值操作而实现的,要注意的是键的增减和判断是否为空。

    Set and Multiset
    Set结构。在table中以元素为键,布尔值为值,使用中遍历table根据键值是否为true判断某个元素是否在set、table中。这里要注意的是table的形式:setTable = {["x"] = true,["y"] = true},因为在lua 中某些词如while、for等是关键字,使用中受限,如不能直接while = true,所以改用这种形式:["while"] = true。

    Multiset结构。在table中,以元素为键,值表示为该元素的出现次数:muSet[ok] = 10,表明ok出现了10次。
    insert和remove操作:
    Insert
    function insert (bag,element)
         bag[element] = (bag[element] or 0 ) +1
    end

    --判断某个元素是否已经在set中了
    --如果某个元素已经在set、table中,则增加其计数

    Remove
    function remove (bag,element)
         local count = bag[element]
         bag[element] = (count and count>1) and count - 1 or nil
    end


    --判断该元素的计数
    --如果计数已经为0了,则将该键的值置为nil,收回内存使用
    --如果该计数不为0是大于1的,那么将该计数减一
    --如果该计数不为0但是等于1,则将该键的值置为nil,收回内存使用

    String Buffers结构。使用table的concat函数。将table中的string值连接起来返回。
    e.g.
    local t = {}
    for line in io.lines() do
         t[#t + 1] = line .. "
    "          --table 的每个键对应一个string值
    end
    local s = table.concat(t)          --将table中所有的string值连在一起返回

    --使用concat函数的第二个参数
    e.g.
    local t = {}
    for line in io.lines() do
         t[#t + 1] = line          --table 的每个键对应一个string值
    end
    local s = table.concat(t,"
    ")     --第二个参数表示在每两个string值间插入的值

    Graphs--没看懂讲的是啥。。。标记

  • 相关阅读:
    BZOJ1001 狼抓兔子 终于过了!
    BZOJ 1901: Zju2112 Dynamic Rankings( 树状数组套主席树 )
    BZOJ 2302: [HAOI2011]Problem c( dp )
    BZOJ 1407: [Noi2002]Savage( 数论 )
    BZOJ 2661: [BeiJing wc2012]连连看( 费用流 )
    BZOJ 1021: [SHOI2008]Debt 循环的债务( dp )
    BZOJ 3170: [Tjoi 2013]松鼠聚会( sort )
    BZOJ 2301: [HAOI2011]Problem b( 数论 )
    BZOJ 2434: [Noi2011]阿狸的打字机( AC自动机 + DFS序 + 树状数组 )
    BZOJ 3231: [Sdoi2008]递归数列( 矩阵快速幂 )
  • 原文地址:https://www.cnblogs.com/zhong-dev/p/4044577.html
Copyright © 2011-2022 走看看