Queue = {} function Queue:new() o = { first = 1, top = 0, data = {} } self.__index = self return setmetatable(o, self) end function Queue:push(val) local top = self.top + 1 self.top = top self.data[top] = val end function Queue:pop() if self:empty() then return nil end local val = self.data[self.first] self.data[self.first] = nil self.first = self.first + 1 return val end function Queue:empty() return self.top < self.first end return Queue