Modul:queue

Hej, du har kommit hit för att leta efter betydelsen av ordet Modul:queue. I DICTIOUS hittar du inte bara alla ordboksbetydelser av ordet Modul:queue, utan du får också veta mer om dess etymologi, dess egenskaper och hur man säger Modul:queue i singular och plural. Allt du behöver veta om ordet Modul:queue finns här. Definitionen av ordet Modul:queue hjälper dig att vara mer exakt och korrekt när du talar eller skriver dina texter. Genom att känna till definitionen avModul:queue och andra ord berikar du ditt ordförråd och får tillgång till fler och bättre språkliga resurser.

Dokumentation för denna modul finns på /dok (redigera), /test


Syfte

Den här modulen innehåller en generell implementering av en Single Queue-datastruktur för moduler som har nytta av det.

Användning

local Queue = require("Modul:queue") --importerar Queue-datastrukturen
local q = Queue()                    --skapar en ny "instans" q
Queue.enqueue(q, "abc")              --lägger till elementet "abc" i kön q

Specifikation

Publika funktioner:
  • enqueue("abc") Lägger till elemenet "abc" i kön.
  • dequeue() Tar bort det första elementet från kön och returnerar det, det vill säga "Först in, först ut". Om kön är tom returneras nil.
  • peek(index) Returnerar elementet som befinner sig på position index i kön. 1 är det första elementet. Om värdet på index är negativt returneras elementet som befinner sig på position index i kön räknat bakifrån. -1 är det sista elementet. Värdet på index kan inte vara 0 eller utanför köns omfång. Då returneras nil.
  • peekFirst() Samma som peek(1).
  • peekSecond() Samma som peek(2).
  • peekLast() Samma som peek(-1).
  • isEmpty() Returnerar true om kön är tom, annars false.
  • length() Returnerar köns längd, dvs köns totala antal element.

Tester

All tests passed. (refresh)

Text Expected Actual
test01_enqueue:
Passed mut.enqueue(q) (nil) (nil)
Text Expected Actual
test02_empty_queue:
Passed mut.isEmpty(q) true true
Passed mut.length(q) 0 0
Passed mut.peekFirst(q) (nil) (nil)
Passed mut.peekSecond(q) (nil) (nil)
Passed mut.peekLast(q) (nil) (nil)
Passed mut.peek(q, 1) (nil) (nil)
Passed mut.peek(q, 0) (nil) (nil)
Passed mut.peek(q, -1) (nil) (nil)
Passed mut.dequeue(q) (nil) (nil)
Text Expected Actual
test03_one_element_added:
Passed mut.isEmpty(q) false false
Passed mut.length(q) 1 1
Passed mut.peekFirst(q) one one
Passed mut.peekSecond(q) (nil) (nil)
Passed mut.peekLast(q) one one
Passed mut.peek(q, 1) one one
Passed mut.peek(q, -1) one one
Passed mut.dequeue(q) one one
Text Expected Actual
test04_two_elements_added:
Passed mut.isEmpty(q) false false
Passed mut.length(q) 2 2
Passed mut.peekFirst(q) one one
Passed mut.peekSecond(q) two two
Passed mut.peekLast(q) two two
Passed mut.peek(q, 1) one one
Passed mut.peek(q, 2) two two
Passed mut.peek(q, -1) two two
Passed mut.peek(q, -2) one one
Text Expected Actual
test05_four_elements_added:
Passed mut.length(q) false false
Passed mut.length(q) 4 4
Passed mut.peekFirst(q) one one
Passed mut.peekSecond(q) two two
Passed mut.peekLast(q) four four
Passed mut.peek(q, 1) one one
Passed mut.peek(q, 4) four four
Passed mut.peek(q, 5) (nil) (nil)
Passed mut.peek(q, 0) (nil) (nil)
Passed mut.peek(q, -1) four four
Passed mut.peek(q, -4) one one
Passed mut.peek(q, -5) (nil) (nil)
Text Expected Actual
test06_multiple:
Passed mut.dequeue(q) (nil) (nil)
Passed mut.length(q) true true
Passed mut.length(q) 0 0
Passed mut.enqueue(q, "one") (nil) (nil)
Passed mut.enqueue(q, "two") (nil) (nil)
Passed mut.length(q) 2 2
Passed mut.dequeue(q) one one
Passed mut.length(q) 1 1
Passed mut.enqueue(q, "three") (nil) (nil)
Passed mut.enqueue(q, "four") (nil) (nil)
Passed mut.length(q) 3 3
Passed mut.dequeue(q) two two
Passed mut.peekFirst(q) three three
Passed mut.peekSecond(q) four four
Passed mut.peekLast(q) four four
Passed mut.length(q) 2 2
Passed mut.dequeue(q) three three
Passed mut.dequeue(q) four four
Passed mut.length(q) true true
Passed mut.dequeue(q) (nil) (nil)
Passed mut.length(q) 0 0


local export = {}

export.prototype = {
    firstIndex = 0,
    lastIndex = -1
}

setmetatable(export, {__call = 
	function()
		local t = {}
	    setmetatable(t, {
	    	__index = export.prototype
	    })
	    return t
    end
})

function export:isEmpty()
	return (self.firstIndex > self.lastIndex)
end

function export:length()
	return (self.lastIndex - self.firstIndex + 1)
end
	
function export:enqueue(item)
	local lastIndex = self.lastIndex + 1
	self.lastIndex = lastIndex
	self = item
end

function export:dequeue()
	local item

	local firstIndex = self.firstIndex
	if (export.isEmpty(self)) then 
		item = nil
	else
		item = self
		self = nil
		self.firstIndex = firstIndex + 1
	end
	
	return item
end

function export:peek(index)
	local item
	
	if (index > 0) then
		item = self
	elseif (index < 0) then
		item = self
	end
	
	return item
end

function export:peekFirst()
	return export.peek(self, 1)
end

function export:peekSecond()
	return export.peek(self, 2)
end

function export:peekLast()
	return export.peek(self, -1)
end

return export