#!/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')