class FullQueueException(Exception):
    pass

class EmptyQueueException(Exception):
    pass

class Queue(object):
    def __init__(self,N=10):
        self.N = N  # Default size of queue = 10
        self._A = [None] * self.N
        self._front = -1
        self._rear = -1

    def isEmpty(self):
        if (self._front == -1) and (self._rear == -1):
            return True
        else:
            return False

    def isFull(self):
        return ((self._rear + 1) % self.N) == self._front

    def enqueue(self,e):
        if self.isEmpty():
            self._front = 0
            self._rear = 0
        elif self.isFull():
            raise FullQueueException('Queue is full')
        else:
            self._rear = (self._rear+1) % self.N
        self._A[self._rear] = e

    def dequeue(self):
        if self.isEmpty():
            raise EmptyQueueException('Queue is empty')
        elif (self._front == self._rear):
            self._A[self._front] = None # Don't care about the data but this is for garbage collector 
            self._front = -1
            self._rear = -1
        else:
            self._A[self._front] = None # Don't care about the data but this is for garbage collector
            self._front = (self._front+1) % self.N
    
    def size(self):
        if self.isEmpty():
            return 0
        return ((self.N - self._front + self._rear) % self.N) + 1

    def front(self):
        if self.isEmpty():
            raise EmptyQueueException('Queue is empty')
        return self._A[self._front]