在Lua中使用List 和 栈图

转自jianguhan

在《Programming in Lua》一书中提到了一个双端队列的实现方法,我把它拿来改进了一下用在了我正在制作的一个RPG游戏里,用起觉得 来还不错,加了一个GetSize()来取得List的大小,这个在游戏制作中用处还是很大的^_^ 

源代码如下: 
CList = class() 

function CList:ctor() 
        self.m_list = { first = 0, last = -1 } 
end 

function CList:PushFront(value) 
        local first = self.m_list.first - 1 
        self.m_list.first = first 
        self.m_list[first] = value 
end 

function CList:PushBack(value) 
        local last = self.m_list.last + 1 
        self.m_list.last = last 
        self.m_list[last] = value 
end 

function CList:PopFront() 
        local first = self.m_list.first 
        if first > self.m_list.last then return nil end 
        local value = self.m_list[first] 
        self.m_list[first] = nil 
        self.m_list.first = first + 1 
        return value 
end 

function CList:PopBack() 
        local last = self.m_list.last 
        if self.m_list.first > last then return nil end 
        local value = self.m_list[last] 
        self.m_list[last] = nil 
        self.m_list.last = last - 1 
        return value 
end 

function CList:GetSize() 
        if self.m_list.first > self.m_list.last then 
                return 0 
        else 
                return math.abs(self.m_list.last - self.m_list.first) + 1 
        end 
end 

在最前面的那句CList = class() 这里使用了云风写的一个class函数创建一个类, 
这个函数可以在云风的博客上找到,为了方便起见我就在这里先抄一下了: 

local _class={} 

function class(super) 
        local class_type={} 
        class_type.ctor=false 
        class_type.super=super 
        class_type.new=function(...) 
                        local obj={} 
                        do 
                                local create 
                                create = function(c,...) 
                                        if c.super then 
                                                create(c.super,...) 
                                        end 
                                        if c.ctor then 
                                                c.ctor(obj,...) 
                                        end 
                                end 

                                create(class_type,...) 
                        end 
                        setmetatable(obj,{ __index=_class[class_type] }) 
                        return obj 
                end 
        local vtbl={} 
        _class[class_type]=vtbl 

        setmetatable(class_type,{__newindex= 
                function(t,k,v) 
                        vtbl[k]=v 
                end 
        }) 

        if super then 
                setmetatable(vtbl,{__index= 
                        function(t,k) 
                                local ret=_class[super][k] 
                                vtbl[k]=ret 
                                return ret 
                        end 
                }) 
        end 

        return class_type 
end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值