will be needing a deque later

This commit is contained in:
Felix Van der Jeugt 2021-12-06 21:37:34 +01:00
parent d5ffd524b1
commit d99434ac43
No known key found for this signature in database
GPG Key ID: 58B209295023754D

81
deque.lua Normal file
View File

@ -0,0 +1,81 @@
function deque()
local cap = 5
local elems = {}
for i = 0, cap - 1 do
elems[i] = nil
end
return {
start = 0,
size = 0,
cap = cap,
elems = elems,
pprint = pprint,
pop = pop,
prepend = prepend,
append = append,
popleft = popleft,
}
end
function pprint(self)
io.write(self.start .. "->" .. self.size .. ": ")
local i = self.start
for i = 0, self.cap - 1 do
io.write((self.elems[i] or "_") .. " ")
end
io.write("\n")
end
local function extend(self)
local copy = {}
for i = 0, self.size - 1 do
copy[i] = self.elems[(self.start + i) % self.size]
end
for i = self.size, 2 * self.size - 1 do
copy[i] = nil
end
self.elems = copy
self.start = 0
self.cap = self.cap * 2
end
function append(self, n)
if self.size == self.cap then
extend(self)
end
self.elems[(self.start + self.size) % self.cap] = n
self.size = self.size + 1
end
function pop(self)
if self.size > 0 then
local i = (self.start + self.size - 1) % self.cap
local v = self.elems[i]
self.elems[i] = nil
self.size = self.size - 1
return v
else
return nil
end
end
function prepend(self, n)
if self.size == self.cap then
extend(self)
end
self.size = self.size + 1
self.start = (self.start + self.cap - 1) % self.cap
self.elems[self.start] = n
end
function popleft(self)
if self.size > 0 then
local v = self.elems[self.start]
self.elems[self.start] = nil
self.start = (self.start + 1) % self.cap
self.size = self.size - 1
return v
else
return nil
end
end