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