Python Data Structures Lab Manual
Python Data Structures Lab Manual
[Link]
Vision
To be a premier centre for academic excellence and research through innovative
interdisciplinary collaborations and making significant contributions to the
community, organizations, and society as a whole.
Mission
To impart cutting-edge Artificial Intelligence technology in accordance with
industry norms.
To instill in students a desire to conduct research in order to tackle challenging
technical problems for industry.
To develop effective graduates who are responsible for their professional
growth, leadership qualities and are committed to lifelong learning.
Quality Policy
PEO1: To possess knowledge and analytical abilities in areas such as maths, science,
and fundamental engineering.
PEO2: To analyse, design, create products, and provide solutions to problems in
Computer Science and Engineering.
PEO3: To leverage the professional expertise to enter the workforce, seek higher
education, and conduct research on AI-based problem resolution.
PEO4: To be solution providers and business owners in the field of computer
science and engineering with an emphasis on artificial intelligence and machine
learning.
PROGRAMOUTCOMES (POs)
Department of CI Page 5
DSP LAB AY-2023-2024
1. Students are advised to come to the laboratory at least 5 minutes before (to starting time), thosewho
come after 5 minutes will not be allowed into the lab.
2. Plan your task properly much before to the commencement, come prepared to the lab withthe
synopsis / program / experiment details.
3. Student should enter into the laboratory with:
a. Laboratory observation notes with all the details (Problem statement, Aim, Algorithm,Procedure,
Program, Expected Output, etc.,) filled in for the lab session.
b. Laboratory Record updated up to the last session experiments and other utensils (if any)needed in
the lab.
c. Proper Dress code and Identity card.
4. Sign in the laboratory login register, write the TIME-IN, and occupy the computer systemallotted to
you by the faculty.
5. Execute your task in the laboratory, and record the results / output in the lab observationnote
book, and get certified by the concerned faculty.
6. All the students should be polite and cooperative with the laboratory staff, must maintain the
discipline and decency in the laboratory.
7. Computer labs are established with sophisticated and high end branded systems, which shouldbe
utilized properly.
8. Students / Faculty must keep their mobile phones in SWITCHED OFF mode during the lab sessions.
Misuse of the equipment, misbehaviors with the staff and systems etc., will attract severe
punishment.
9. Students must take the permission of the faculty in case of any urgency to go out ; if anybody found
loitering outside the lab / class without permission during working hours willbe treated seriously and
punished appropriately.
10. Students should LOG OFF/ SHUT DOWN the computer system before he/she leaves the lab after
completing the task (experiment) in all aspects. He/she must ensure the system / seat is kept
properly.
Department of CI Page 6
INDEX
[Link] Name of the program Page
No
Write a Python program for class, Flower, that has three instance variables of type str,
int, and float that respectively represent the name of the flower, its number of petals,
and its price. Your class must include a constructor method that initializes each
1. variable toan appropriate value, and your class should include methods forsetting the 1
value of each type, and retrieving the value of each type.
Develop an inheritance hierarchy based upon a Polygon class thathas abstract
methods area( ) and perimeter( ). Implement classes Triangle, Quadrilateral, Pentagon,
that extend this base class, with the obvious meanings for the area( ) and perimeter( )
2. methods. Write a simple program that allows users to create polygons of the various 5
types and input their geometric dimensions, and the program then outputs their area
and perimeter.
14
Write a program to implement Bubble Sort and Selection Sort
5.
6. Write a program to implement Merge sort and Quick sort 16
7. Write a program to implement Stacks and Queues 19
8.
Write a program to implement Singly Linked List
25
1. Write a Python program for class, Flower, that has three instance variables of type str,
int, and float, that respectively represent the name of the flower, its number of petals, and
its price. Your class must include a constructor method that initializes each variable to an
appropriate value, and your class should include methods for setting the value of each type,
and retrieving the value of each type.
Program:
class Flower:
#Common base class for all Flowers
def init (self, petalName, petalNumber, petalPrice):
[Link] = petalName
[Link] = petalNumber
[Link] = petalPrice
def getName(self):
return [Link]
def getPetals(self):
return [Link]
def getPrice(self):
return [Link]
print ("\n")
Output:
Exercise Programs:
Page 3
Data Structures Lab 2023-2024
Page 4
Data Structures Lab 2023-2024
2. Develop an inheritance hierarchy based upon a Polygon class that has abstract methods
area( ) and perimeter( ). Implement classes Triangle, Quadrilateral, Pentagon, that extend
this base class, with the obvious meanings for the area( ) and perimeter( ) methods. Write
a simple program that allows users to create polygons of the various types and input their
geometric dimensions, and the program then outputs their area and perimeter.
Program:
from abc import abstractmethod, ABCMeta
import math
@abstractmethod
def area(self):
pass
@abstractmethod
def perimeter(self):
pass
class Triangle(Polygon):
def init (self, side_lengths):
super(). init (side_lengths, 3)
self._perimeter = [Link]()
self._area = [Link]()
def perimeter(self):
return(sum(self._side_lengths))
def area(self):
#Area of Triangle
s = self._perimeter/2
product = s
for i in self._side_lengths:
product*=(s-i)
return product**0.5
class Quadrilateral(Polygon):
def init (self, side_lengths):
super(). init (side_lengths, 4)
self._perimeter = [Link]()
self._area = [Link]()
def perimeter(self):
return(sum(self._side_lengths))
def area(self):
class Pentagon(Polygon):
def init (self, side_lengths):
super(). init (side_lengths, 5)
self._perimeter = [Link]()
self._area = [Link]()
def perimeter(self):
return((self._side_lengths) * 5)
def area(self):
#object of Triangle
t1 = Triangle([1,2,2])
print([Link](),
[Link]())
#object of Quadrilateral
q1 = Quadrilateral([1,1,1,1])
print([Link](),
[Link]())
Output:
Exercise Programs:
Method Overloading
Method overloading is an OOPS concept which provides ability to have several methods
having the same name with in the class where the methods differ in types or number of
arguments passed.
Method overloading in its traditional sense (as defined above) as exists in other languages
like method overloading in Java doesn’t exist in Python.
In Python if you try to overload a function by having two or more functions having the same
name but different number of arguments only the last defined function is recognized, calling
any other overloaded function results in an error.
Since using the same method name again to overload the method is not possible in Python, so
achieving method overloading in Python is done by having a single method with several
parameters. Then you need to check the actual number of arguments passed to the method
and perform the operation accordingly.
Program:
class OverloadDemo:
# sum method with default as None for parameters
def sum(self, a=None, b=None, c=None):
# When three params are passed
if a!=None and b!=None and c!=None:
s = a + b + c
print('Sum = ', s)
# When two params are passed
elif a!=None and b!=None:
s = a + b
print('Sum = ', s)
od = OverloadDemo()
[Link](7, 8)
[Link](7, 8, 9)
Output:
Method overriding provides ability to change the implementation of a method in a child class
which is already defined in one of its super class. If there is a method in a super class and
method having the same name and same number of arguments in a child class then the child
class method is said to be overriding the parent class method.
When the method is called with parent class object, method of the parent class is executed.
When method is called with child class object, method of the child class is executed. So the
appropriate overridden method is called based on the object type, which is an example of
Polymorphism.
Program:
class Person:
def init (self, name, age):
[Link] = name
[Link] = age
def displayData(self):
print('In parent class displayData method')
print([Link])
print([Link])
class Employee(Person):
def init (self, name, age, id):
# calling constructor of super class
super(). init (name, age)
[Link] = id
def displayData(self):
print('In child class displayData method')
print([Link])
print([Link])
print([Link])
Output:
Output:
left = 0
right = len(List) - 1
global iterations
iterations = 0
Output:
Exercise Programs:
Output:
Output:
Exercise Programs:
Output:
while True:
while (i <= j and alist[i] <= pivot):
i = i + 1
while (i <= j and alist[j] >= pivot):
j = j - 1
if i <= j:
alist[i], alist[j] = alist[j], alist[i]
else:
alist[start], alist[j] = alist[j], alist[start]
return j
Output:
Stack Program:
stack = Stack(3)
Output:
Queue Program:
# Custom queue implementation in Python
class Queue:
# Initialize queue
def init (self, size):
self.q = [None] * size # list to store queue elements
[Link] = size # maximum capacity of the queue
[Link] = 0 # front points to the front element in the queue
[Link] = -1 # rear points to the last element in the queue
[Link] = 0 # current size of the queue
return self.q[[Link]]
[Link](1)
[Link](2)
[Link](3)
[Link]()
[Link]()
if [Link]():
print("The queue is empty")
else:
print("The queue is not empty")
Output:
Program:
import os
from typing import NewType
class _Node:
'''
Creates a Node with two fields:
1. element (accesed using ._element)
2. link (accesed using ._link)
'''
slots = '_element', '_link'
class LinkedList:
'''
Consists of member funtions to perform different
operations on the linked list.
'''
def isempty(self):
'''
Returns True if linked list is empty, otherwise False.
'''
return self._size == 0
if [Link]():
self._head = newest
else:
self._tail._link = newest
self._tail = newest
self._size += 1
if [Link]():
self._head = newest
self._tail = newest
else:
newest._link = self._head
self._head = newest
self._size += 1
i = index - 1
p = self._head
if [Link]():
[Link](e)
else:
for i in range(i):
p = p._link
newest._link = p._link
p._link = newest
print(f"Added Item at index {index}!\n\n")
self._size += 1
def removeFirst(self):
'''
Removes element from the beginning of the linked list.
Returns the removed element.
'''
if [Link]():
print("List is Empty. Cannot perform deletion
operation.")
return
e = self._head._element
self._head = self._head._link
self._size = self._size - 1
if [Link]():
self._tail = None
return e
def removeLast(self):
'''
Removes element from the end of the linked list.
Returns the removed element.
'''
if [Link]():
print("List is Empty. Cannot perform deletion
operation.")
return
p = self._head
if p._link == None:
e = p._element
self._head = None
else:
while p._link._link != None:
p = p._link
e = p._link._element
p._link = None
self._tail = p
self._size = self._size - 1
return e
if index == 0:
return [Link]()
elif index == self._size - 1:
return [Link]()
else:
for x in range(i):
p = p._link
e = p._link._element
p._link = p._link._link
self._size -= 1
return e
def display(self):
###################################################################
def options():
'''
Prints Menu for operations
'''
options_list = ['Add Last', 'Add First', 'Add Anywhere',
'Remove First', 'Remove Last', 'Remove Anywhere',
'Display List', 'Print Size', 'Search', 'Exit']
print("MENU")
for i, option in enumerate(options_list):
print(f'{i + 1}. {option}')
elif choice == 2:
elem = int(input("Enter Item: "))
[Link](elem)
print("Added Item at First!\n\n")
elif choice == 3:
elem = int(input("Enter Item: "))
index = int(input("Enter Index: "))
[Link](elem, index)
elif choice == 4:
print("Removed Element from First:", [Link]())
elif choice == 5:
print("Removed Element from last:", [Link]())
elif choice == 6:
index = int(input("Enter Index: "))
print(f"Removed Item: {[Link](index)} !\n\n")
elif choice == 7:
print("List: ", end='')
[Link]()
print("\n")
elif choice == 8:
print("Size:", len(L))
print("\n")
elif choice == 9:
key = int(input("Enter item to search: "))
if [Link](key) >= 0:
print(f"Item {key} found at index position
{[Link](key)}\n\n")
else:
print("Item not in the list\n\n")
###################################################################
Output:
Exercise Programs:
Program:
import os
class _Node:
'''
Creates a Node with three fields:
1. element (accessed using ._element)
2. link (accessed using ._link)
3. prev (accessed using ._prev)
'''
slots = '_element', '_link', '_prev'
class DoublyLL:
'''
Consists of member funtions to perform different
operations on the doubly linked list.
'''
def isempty(self):
'''
Returns True if doubly linked list is empty, otherwise False.
'''
return self._size == 0
if [Link]():
self._head = newest
else:
self._tail._link = newest
newest._prev = self._tail
self._tail = newest
self._size += 1
if [Link]():
self._head = newest
self._tail = newest
else:
newest._link = self._head
self._head._prev = newest
self._head = newest
self._size += 1
def removeFirst(self):
'''
Removes element from the beginning of the doubly linked list.
Returns the removed element.
'''
if [Link]():
print('List is already empty')
return
e = self._head._element
self._head = self._head._link
self._size -= 1
if [Link]():
self._tail = None
else:
self._head._prev = None
return e
def removeLast(self):
'''
Removes element from the end of the doubly linked list.
Returns the removed element.
'''
if [Link]():
print("List is already empty")
return
e = self._tail._element
self._tail = self._tail._prev
self._size -= 1
if [Link]():
self._head = None
else:
self._tail._link = None
return e
def display(self):
'''
Utility function to display the doubly linked list.
'''
if [Link]():
print("List is Empty")
return
p = self._head
print("NULL<-->", end='')
while p:
print(p._element, end="<-->")
p = p._link
print("NULL")
###################################################################
def options():
'''
Prints Menu for operations
'''
options_list = ['Add Last', 'Add First', 'Add Anywhere',
'Remove First', 'Remove Last', 'Remove Anywhere',
'Display List', 'Exit']
print("MENU")
for i, option in enumerate(options_list):
print(f'{i + 1}. {option}')
def switch_case(choice):
'''
Switch Case for operations
'''
[Link]('cls')
if choice == 1:
elem = int(input("Enter Item: "))
[Link](elem)
print("Added Item at Last!\n\n")
elif choice == 2:
elem = int(input("Enter Item: "))
[Link](elem)
print("Added Item at First!\n\n")
elif choice == 3:
elem = int(input("Enter Item: "))
index = int(input("Enter Index: "))
[Link](elem, index)
elif choice == 4:
print("Removed Element from First:", [Link]())
elif choice == 5:
print("Removed Element from last:", [Link]())
elif choice == 6:
index = int(input("Enter Index: "))
print(f"Removed Item: {[Link](index)} !\n\n")
elif choice == 7:
print("List:")
[Link]()
print("\n")
elif choice == 8:
import sys
[Link]()
###################################################################
Output:
Exercise Programs:
10 . Write a python program to implement DFS & BFS graph traversal Techniques
# Constructor
def init (self):
while queue:
# Driver code
Output:
10. Write a program for BFS & DFS Graph traversal techniques
# Constructor
def init (self):
# Driver's code
if name == " main ":
g = Graph()
[Link](0, 1)
[Link](0, 2)
[Link](1, 2)
[Link](2, 0)
[Link](2, 3)
[Link](3, 3)
# Function call
[Link](2)
Output:
Program:
# # # Binary Search Tree
class binarySearchTree:
def init (self,val=None):
[Link] = val
[Link] = None
[Link] = None
def insert(self,val):
# check if there is no root
if ([Link] == None):
[Link] = val
# check where to insert
else:
# check for duplicate then stop and return
if val == [Link]: return 'no duplicates allowed in binary search tree'
# check if value to be inserted < currentNode's value
if (val < [Link]):
# check if there is a left node to currentNode if true then recurse
if([Link]):
[Link](val)
# insert where left of currentNode when [Link]=None
else: [Link] = binarySearchTree(val)
def breadthFirstSearch(self):
currentNode = self
bfs_list = []
queue = []
[Link](0,currentNode)
while(len(queue) > 0):
currentNode = [Link]()
bfs_list.append([Link])
if([Link]):
[Link](0,[Link])
if([Link]):
[Link](0,[Link])
return bfs_list
# In order means first left child, then parent, at last right child
def depthFirstSearch_INorder(self):
return [Link]([])
# Pre order means first parent, then left child, at last right child
def depthFirstSearch_PREorder(self):
return [Link]([])
# Post order means first left child, then right child , at last parent
def depthFirstSearch_POSTorder(self):
return [Link]([])
if (len(nodes_effected)==1):
if (parent_node.[Link] == deleteing_node.val) :
parent_node.left = None
else: parent_node.right = None
return 'Succesfully deleted'
# if len(nodes_effected) > 1 which means the node
we are# going to delete has 'children',
# so the tree must be rearranged from the deleteing_node
else:
# if the node we want to delete doesn't have any
parent# means the node to be deleted is 'root' node
if (parent_node == None):
nodes_effected.remove(deleteing_node.val)
# make the 'root' nodee i.e self
value,left,right to None, # this means we need
to implement a new tree again without # the
deleted node
[Link] = None
[Link] = None
[Link] = None
bst = binarySearchTree()
[Link](7)
[Link](4)
[Link](9)
[Link](0)
[Link](5)
[Link](8)
[Link](13)
# 7
# / \
# / \
# 4 9
# / \ / \
# 0 5 8 13
print([Link](5))
print([Link](9))
print([Link](7))
# after deleting
print('IN order: ',bst.depthFirstSearch_INorder())
print('PRE order:' ,bst.depthFirstSearch_PREorder())
print('POST order:', bst.depthFirstSearch_POSTorder())
Output:
# B plus tree
class BplusTree:
def init (self, order):
[Link] = Node(order)
[Link].check_leaf = True
# Insert operation
def insert(self, value, key):
value = str(value)
old_node = [Link](value)
old_node.insert_at_leaf(old_node, value, key)
if (len(old_node.values) == old_node.order):
node1 = Node(old_node.order)
node1.check_leaf = True
[Link] = old_node.parent
mid = int([Link](old_node.order / 2)) - 1
[Link] = old_node.values[mid + 1:]
[Link] = old_node.keys[mid + 1:]
[Link] = old_node.nextKey
old_node.values = old_node.values[:mid + 1]
old_node.keys = old_node.keys[:mid + 1]
old_node.nextKey = node1
self.insert_in_parent(old_node, [Link][0], node1)
parentNode = [Link]
temp3 = [Link]
for i in range(len(temp3)):
if (temp3[i] == n):
[Link] = [Link][:i] + \
[value] + [Link][i:]
[Link] = [Link][:i +
1] + [ndash]
+ [Link][i + 1:]
if (len([Link]) > [Link]):
parentdash = Node([Link])
[Link] = [Link]
mid = int([Link]([Link] / 2)) - 1
[Link] = [Link][mid + 1:]
[Link] = [Link][mid + 1:]
value_ = [Link][mid]
if (mid == 0):
[Link] = [Link][:mid +
1]
else:
[Link] = [Link][:mid]
[Link] = [Link][:mid + 1]
for j in [Link]:
[Link] = parentNode
for j in [Link]:
[Link] = parentdash
self.insert_in_parent(parentNode, value_,
parentdash)
if (flag == 0):
lev_leaf = lev
leaf = x
Department of CSE AIML Page 55
Data Structures Lab 2023-2024
flag = 1
record_len = 3
bplustree = BplusTree(record_len)
[Link]('5', '33')
[Link]('15', '21')
[Link]('25', '31')
[Link]('35', '41')
[Link]('45', '10')
printTree(bplustree)
if([Link]('5', '34')):
print("Found")
else:
print("Not found")
Output: