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]:
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]:
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())