Modul:queue

Definition från Wiktionary, den fria ordlistan.
Hoppa till navigering Hoppa till sök

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


Syfte[redigera]

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

Användning[redigera]

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[redigera]

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[redigera]

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[lastIndex] = item
end

function export:dequeue()
	local item

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

function export:peek(index)
	local item
	
	if (index > 0) then
		item = self[self.firstIndex - 1 + index]
	elseif (index < 0) then
		item = self[self.lastIndex + 1 + index]
	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