In [23]:
#stacks using lists
mylist = [1,4,5,6]
mylist.append(8)
mylist.pop()
mylist.pop()
mylist

mylist2 = [4,5,6,7]
mylist2.pop(2)
mylist2


Out[23]:
[4, 5, 7]

In [19]:
#queues
#fast appends and pops from both sides 
from collections import deque 
myq = deque([1, 2, 5])
myq.append('a')
myq.appendleft('b')
myq.popleft()
myq.pop()
myq.remove(2)
myq

#other implementations:
#simple circular array, dynamic ciruclar array, linked list


Out[19]:
deque([1, 5])

In [20]:
#help(deque)

In [33]:
#simple circular array implementation
class Queue(object):
    def __init__(self, limit=5):
        self.que=[]
        self.limit = limit
        self.front = None
        self.rear = None
        self.size = 0
    def isEmpty(self):
        return self.size<=0
    def enQueue(self, item):#insert element at end of queue
        if self.size>=self.limit:
            print("Queue Overflow!")
            return
        else:
            self.que.append(item)
            
        if self.front is None:
            self.front = self.rear = 0
        else:
            self.rear = self.size
        self.size+=1
        print('Queue after enQueue', self.que)
        
    def deQueue(self):#remove and return element at front of que
        if self.size<=0:
            print('Queue Underflow!')
            return 0
        else:
            self.que.pop(0)#pops index 0
            self.size-=1
            if self.size == 0:
                self.front = self.rear = None
            else:
                self.rear = self.size - 1
            print('Queue after deQueue', self.que)
                
    def queueRear(self):
        if self.rear is None:
            print('Sorry, queue is empty')
            raise IndexError
        return self.que[self.rear]
    
    def queueFront(self):
        if self.front is None:
            print('Sorry, queue is empty')
            raise IndexError
        return self.que[self.front]
            
    def size(self):
        return self.size

In [34]:
q = Queue()
q.enQueue('first')
print('Front ', q.queueFront())
print('Rear ', q.queueRear())

q.enQueue('second')
print('Front ', q.queueFront())
print('Rear ', q.queueRear())

q.enQueue('third')
print('Front ', q.queueFront())
print('Rear ', q.queueRear())

q.deQueue()#removes from front
print('Front ', q.queueFront())
print('Rear ', q.queueRear())


Queue after enQueue ['first']
Front  first
Rear  first
Queue after enQueue ['first', 'second']
Front  first
Rear  second
Queue after enQueue ['first', 'second', 'third']
Front  first
Rear  third
Queue after deQueue ['second', 'third']
Front  second
Rear  third