Queue/Definition: Difference between revisions

Content added Content deleted
(obsolete)
(Removed "import queues" as module no longer exists. Added description of queue and basic operations. Added try..except when popping from empty queue.)
Line 3,626: Line 3,626:


=={{header|Nim}}==
=={{header|Nim}}==
<lang nim>import queues
<lang nim>type


Node[T] = ref object
# defining push & pop (obviously optional)
value: T
proc push*[T](q: var TQueue[T]; item: T) =
add(q,item)
next: Node[T]
proc pop*[T](q: var TQueue[T]): T =
result = dequeue(q)


Queue*[T] = object
var fifo: TQueue[int] = initQueue[int]()
head, tail: Node[T]
length: Natural

func initQueue*[T](): Queue[T] = Queue[T]()

func len*(queue: Queue): Natural =
queue.length

func isEmpty*(queue: Queue): bool {.inline.} =
queue.len == 0

func push*[T](queue: var Queue[T]; value: T) =
let node = Node[T](value: value, next: nil)
if queue.isEmpty: queue.head = node
else: queue.tail.next = node
queue.tail = node
inc queue.length

func pop*[T](queue: var Queue[T]): T =
if queue.isEmpty:
raise newException(ValueError, "popping from empty queue.")
result = queue.head.value
queue.head = queue.head.next
dec queue.length
if queue.isEmpty: queue.tail = nil

var fifo = initQueue[int]()


fifo.push(26)
fifo.push(26)
fifo.push(99)
fifo.push(99)
fifo.push(2)
fifo.push(2)
echo("Fifo size: ", fifo.len())
echo "Fifo size: ", fifo.len()
echo("Popping: ", fifo.pop())
echo "Popping: ", fifo.pop()
echo("Popping: ", fifo.pop())
echo "Popping: ", fifo.pop()
echo("Popping: ", fifo.pop())
echo "Popping: ", fifo.pop()
try:
#echo("Popping: ", fifo.pop()) # popping an empty stack raises [EAssertionFailed]</lang>
echo "Popping: ", fifo.pop()
except ValueError:
echo "Exception catched: ", getCurrentExceptionMsg()</lang>
{{out}}
{{out}}
<pre>Fifo size: 3
<pre>Fifo size: 3
Popping: 26
Popping: 26
Popping: 99
Popping: 99
Popping: 2</pre>
Popping: 2
Exception catched: popping from empty queue.</pre>


=={{header|OCaml}}==
=={{header|OCaml}}==