class Queue : IPushPop { private class Item(val data : T, var next : Item) private var head : Item = null private var tail : Item = null override fun push(item : T) { val i = Item(item) if (tail == null) { head = i tail = head } else { tail.next = i tail = i } } override fun pop() = if (head == null) throw UnderflowException() else { val result = head.data head = head.next if (head == null) tail = null result } override val isEmpty get() = head == null }