How to resolve the algorithm Queue/Definition step by step in the Python programming language
How to resolve the algorithm Queue/Definition step by step in the Python programming language
Table of Contents
Problem Statement
Implement a FIFO queue. Elements are added at one side and popped from the other in the order of insertion.
Operations:
Errors:
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Queue/Definition step by step in the Python programming language
FIFO queue class (class-based)
This Python code defines a class called FIFO
that implements a first-in, first-out (FIFO) queue. A FIFO queue is a data structure that maintains the order of elements added to it, where the first element added is the first one to be removed.
Class Definition
class FIFO(object):
# ...
The FIFO
class is defined as a new-style class (indicated by the object
base class in Python 2) with the following methods and attributes:
Constructor
def __init__(self, *args):
self.contents = list(args)
The constructor takes any number of arguments and initializes the contents
attribute as a list containing these arguments.
Callable
def __call__(self):
return self.pop()
The class can be called like a function to retrieve the first element in the queue. This is equivalent to calling the pop
method.
Length
def __len__(self):
return len(self.contents)
The __len__
method returns the number of elements in the queue.
Pop
def pop(self):
return self.contents.pop(0)
The pop
method removes and returns the first element in the queue.
Push
def push(self, item):
self.contents.append(item)
The push
method adds an item to the end of the queue.
Extend
def extend(self,*itemlist):
self.contents += itemlist
The extend
method adds multiple items to the end of the queue.
Empty
def empty(self):
return bool(self.contents)
The empty
method returns True
if the queue is empty (has no elements) and False
otherwise.
Iterator
def __iter__(self):
return self
def next(self):
if self.empty():
raise StopIteration
return self.pop()
The __iter__
and next
methods implement the Python iterator protocol, allowing the FIFO
object to be used in a for
loop. It iterates over the elements in the queue, returning each element in FIFO order until the queue is empty.
Example Usage
The example usage at the bottom of the code demonstrates how to use the FIFO
class:
- A
FIFO
object is created and elements are pushed onto it. - The elements are then popped off the queue and printed, showing that they are retrieved in FIFO order.
FIFO queue class (old-style class)
This code defines a non-new-style class (old-style class in Python 2) called FIFO
that implements a FIFO queue.
Class Definition
class FIFO: ## NOT a new-style class, must not derive from "object"
# ...
The FIFO
class does not derive from the object
base class, indicating that it is an old-style class.
getattr
def __getattr__(self, attr):
return getattr(self.contents,attr)
In the absence of a __getattr__
method, accessing attributes of the FIFO
object would raise an AttributeError
. The overriding implementation of __getattr__
allows attributes of the underlying contents
list to be accessed directly on the FIFO
object.
Example Usage
The example usage at the bottom of the code demonstrates how to use the FIFO
class:
- A
FIFO
object is created and elements are added to it. - The elements are then retrieved and printed, showing that they are retrieved in FIFO order.
FIFO queue using collections.deque
The collections.deque
class is a built-in Python data structure that provides deque (double-ended queue) functionality, which includes FIFO behavior.
Example Usage
The example usage at the bottom of the code demonstrates how to use the deque
class:
- A
deque
object is created and elements are appended to it. - The elements are then popped from the left side of the deque (FIFO order).
- The
isempty
attribute is used to check if the deque is empty.
Source code in the python programming language
class FIFO(object):
def __init__(self, *args):
self.contents = list(args)
def __call__(self):
return self.pop()
def __len__(self):
return len(self.contents)
def pop(self):
return self.contents.pop(0)
def push(self, item):
self.contents.append(item)
def extend(self,*itemlist):
self.contents += itemlist
def empty(self):
return bool(self.contents)
def __iter__(self):
return self
def next(self):
if self.empty():
raise StopIteration
return self.pop()
if __name__ == "__main__":
# Sample usage:
f = FIFO()
f.push(3)
f.push(2)
f.push(1)
while not f.empty():
print f.pop(),
# >>> 3 2 1
# Another simple example gives the same results:
f = FIFO(3,2,1)
while not f.empty():
print f(),
# Another using the default "truth" value of the object
# (implicitly calls on the length() of the object after
# checking for a __nonzero__ method
f = FIFO(3,2,1)
while f:
print f(),
# Yet another, using more Pythonic iteration:
f = FIFO(3,2,1)
for i in f:
print i,
class FIFO: ## NOT a new-style class, must not derive from "object"
def __init__(self,*args):
self.contents = list(args)
def __call__(self):
return self.pop()
def empty(self):
return bool(self.contents)
def pop(self):
return self.contents.pop(0)
def __getattr__(self, attr):
return getattr(self.contents,attr)
def next(self):
if not self:
raise StopIteration
return self.pop()
from collections import deque
fifo = deque()
fifo. appendleft(value) # push
value = fifo.pop()
not fifo # empty
fifo.pop() # raises IndexError when empty
You may also check:How to resolve the algorithm Weird numbers step by step in the Python programming language
You may also check:How to resolve the algorithm Subleq step by step in the Arturo programming language
You may also check:How to resolve the algorithm Sorting algorithms/Quicksort step by step in the ALGOL 68 programming language
You may also check:How to resolve the algorithm Totient function step by step in the ALGOL 68 programming language
You may also check:How to resolve the algorithm Null object step by step in the Rust programming language