solution_222b.py

#!/usr/bin/python3
# ====================================================================
# queue (FIFO queue)
#
# Notes:
# 1. queue.Queue and collections.deque serve different purposes.
#    queue.Queue is intended for allowing different threads to
#    communicate using queued messages/data, whereas collections.deque
#    is simply intended as a data structure.
# 2. Deque (Doubly Ended Queue)
# 3. FOQ = Front Of Queue
# 4. BOQ = Back Of Queue
#
# Useful URL: www.geeksforgeeks.org/deque-in-python/
# ====================================================================

from collections import deque

# --------------------------------------------------------------------
# --- FIFO queue class
# --------------------------------------------------------------------

class Queue:

    # initialize queue  
    def __init__(self):
        self.queue = deque()

    # pop from FOQ           
    def pop(self) -> any:
        if len(self.queue) == 0: return None
        return self.queue.popleft()

    # push onto BOQ        
    def push(self,e:any):
        self.queue.append(e)
        return

    # modify FOQ
    def modify_tos(self,e:any):
        if len(self.queue) == 0: return False
        self.queue[0] = e
        return True
    
    # is queue empty?
    def is_empty(self):
        if len(self.queue) == 0: return True
        return False

    # return copy of FOQ        
    def foq(self):
        if len(self.queue) == 0: return None 
        return self.queue[0]

    # length of queue
    # (return the number elements)
    def length(self):
        return len(self.queue)

    # clear (empty) queue
    # (return the count of elements removed)
    def clear(self):
        i = 0
        for _ in range(len(self.queue)):
            self.queue.pop()
            i += 1
        return i

    # return queue as a list of tokens
    def as_list(self):
        return list(self.queue)

# --------------------------------------------------------------------
# ---- main
# --------------------------------------------------------------------

if __name__ == '__main__':

    import user_interface as ui

    def enter_queue_element():
        e = ui.get_user_input('Enter queue element: ')
        if not e: return None    # empty string
        return e

    menu = '''
------ Test collections.deque as FIFO queue ------
--------------------------------------------------
Option  Description
------  ------------------------------------------
  1     push last in queue
  2     pop first in queue  (element removed)
  3     copy first in queue (element not removed)
  4     modify first in queue
  5     is queue empty?
  6     queue length
  7     clear (empty) the queue
  8     display queue as list
  9     display queue as string'''
    print(menu)

    queue = Queue()
    
    while True:

        # ---- ask the user to select option

        print()
        s = ui.get_user_input('Enter option: ')

        if not s: break

        tf,opt = ui.is_integer(s)

        if not tf:
            print()
            print(f'Illegal option ({s}) - try again')
            continue

        if opt == 0:        # exit program
            break

        if opt == 1:         # push onto queue
            e = enter_queue_element()
            if e is not None: queue.push(e)
            continue

        if opt == 2:         # pop from queue
            print(f'{queue.pop()} (poped from FOQ)')
            continue

        if opt == 3:         # copy of top of queue
            print(f'{queue.foq()} (copied from FOQ)')
            continue

        if opt == 4:         # modify top of queue
            e = enter_queue_element()
            if e is not None: print(queue.modify_tos(e))
            continue

        if opt == 5:         # is queue empty
            print(queue.is_empty())
            continue

        if opt == 6:         # queue length
            print(queue.length())
            continue

        if opt == 7:         # clear (empty) queue
            count = queue.clear()
            continue

        if opt == 8:         # display queue as list
            print(queue.as_list())
            continue

        if opt == 9:         # display queue as a string
            print(','.join(queue.as_list()))
            continue

        print()
        print(f'Unknown option ({opt}) - try again')