# A simple example of a queue

# This file serves mainly as a demonstration of
# the queue idea, implementation and management.

# Python provides a queue module which
# should be used in most standard "real life" applications.
# For more details on queue module see
# https://docs.python.org/3/library/queue.html

# A standard example application of a queue can be seen in
# the method BinaryTree.BFS() in file adttree.py

class Queue:
    def __init__(self):
        self.items = []

    def size(self):
        return len(self.items)

    # note the prefix "is" denoting a boolean function
    def isEmpty(self):
        if self.size() == 0:
            return True
        else:
            return False

    def insert(self, item):
        self.items.append(item)

    def delFront(self):
        if self.isEmpty():
            return None
        top = self.items[0]
        del( self.items[0] )
        return top


    def display(self):
        if self.size() == 0:
            print("Queue is empty.")
            return
        border = ["+"] + [ ("-"*(2+len(str(it))) + "+") for it in self.items ]
        itstr = [" "+ (str(it)) + " " for it in self.items ]
        print( "".join(border) )
        print( "|" + "|".join(itstr) + "|" )
        print( "".join(border) )

    # many aliases
    def enqueue(self, item ):
        self.insert( item )

    def put(self, item ):
        self.insert( item )

    def insTail(self, item ):
        self.insert( item )

    def push(self, item ):
        self.insert( item )

    def pop(self):
        return self.delFront()

    def delete(self):
        return self.delFront()

    def dequeue(self):
        return self.delFront()

    # ---- end of class Queue -----------------------




q = Queue()
q.insert(10)
q.insert(20)
q.display()
q.insert(30)
q.insert(40)
q.display()
q.delete()
q.display()
q.delete()
q.display()
q.delete()
q.display()
q.delete()
q.display()






