class Empty(Exception):
pass
class CircularQueue:
class _Node:
def __init__(self, e, nxt):
self._element = e
self._next = nxt
def __init__(self):
self._tail = None
self._size = 0
def __len__(self):
return self._size
def is_empty(self):
return self._size == 0
def first(self):
if self.is_empty():
raise Empty("The queue is empty.")
head = self._tail._next
return head._element
def dequeue(self):
if self.is_empty():
raise Empty("The queue is empty.")
oldhead = self._tail._next
if len(self) == 1:
self._tail = None
else:
self._tail._next = oldhead._next
self._size -= 1
return oldhead._element
def enqueue(self, e):
newnode = CircularQueue._Node(e, None)
if self.is_empty():
newnode._next = newnode
else:
oldhead = self._tail._next
newnode._next = oldhead
self._tail._next = newnode
self._tail = newnode
self._size += 1
def rotate(self):
if not self.is_empty():
self._tail = self._tail._next