Python
Python
class Node:
def __init__(self, data):
self.data = data
self.next = None
class SinglyLinkedList:
def __init__(self):
self.head = None
def delete_from_beginning(self):
if not self.head:
print("List is empty. Nothing to delete.")
return
self.head = self.head.next
def delete_from_end(self):
if not self.head:
print("List is empty. Nothing to delete.")
return
if not self.head.next:
self.head = None
return
second_last = self.head
while second_last.next.next:
second_last = second_last.next
second_last.next = None
def traverse(self):
current_node = self.head
while current_node:
yield current_node.data
current_node = current_node.next
def sort(self):
elements = list(self.traverse())
elements.sort()
self.head = None
for element in elements:
self.add_node_at_the_end(element)
def reverse(self):
prev = None
current = self.head
while current:
next_node = current.next
current.next = prev
prev = current
current = next_node
self.head = prev
def display(self):
current_node = self.head
while current_node:
print(current_node.data, end=" ")
current_node = current_node.next
print()
linked_list = SinglyLinkedList()
while True:
print("\n1. Add a Node in the Linked List.")
print("2. Delete a Node from the Linked List.")
print("3. Traverse the Nodes of the Linked List.")
print("4. Sort the Linked List.")
print("5. Reverse the Linked List.")
print("6. Exit")
choice = int(input("Enter your choice: "))
if choice == 1:
print("\n1. Add a Node at the beginning of the Linked List.")
print("2. Add a Node at the end of the Linked List.")
print("3. Add a Node at any position in the Linked List.")
ch = int(input("Enter your choice: "))
if ch == 1:
data = int(input("Enter data to add at the beginning of the Linked
List: "))
linked_list.add_node_at_the_begin(data)
linked_list.display()
elif ch == 2:
data = int(input("Enter data to add at the end of the Linked List: "))
linked_list.add_node_at_the_end(data)
linked_list.display()
elif ch == 3:
data = int(input("Enter data to add in the Linked List: "))
pos = int(input("Enter the position to add a Node in the Linked List:
"))
linked_list.insert_at_position(pos,data)
linked_list.display()
elif choice == 2:
print("\n1. Delete a Node from the beginning of the Linked List.")
print("2. Delete a Node from the end of the Linked List.")
print("3. Delete a Node from any position in the Linked List.")
ch = int(input("Enter your choice: "))
if ch == 1:
linked_list.delete_from_beginning()
linked_list.display()
elif ch == 2:
linked_list.delete_from_end()
linked_list.display()
elif ch == 3:
pos = int(input("Enter the position of the Node to delete from the
Linked List: "))
linked_list.delete_at_position(pos)
linked_list.display()
elif choice == 3:
linked_list.traverse()
linked_list.display()
elif choice == 4:
linked_list.sort()
linked_list.display()
elif choice == 5:
linked_list.reverse()
linked_list.display()
elif choice == 6:
break
else:
print("Invalid choice. Please try again.")
2. Write a Python program to implement the basic operations of Stack. Write the
corresponding algorithm.
class Stack:
def __init__(self):
self.items = []
def pop(self):
if not self.is_empty():
return self.items.pop()
else:
raise IndexError("Pop not possible ! Stack is empty !!!")
def peek(self):
if not self.is_empty():
return self.items[-1]
else:
raise IndexError("Peek not possible ! Stack is empty !!!")
def is_empty(self):
return len(self.items) == 0
stack = Stack()
while True:
print("\n1. Push an element in the Stack.")
print("2. Pop from the Stack.")
print("3. Peek an element from the Stack.")
print("4. Check whether the stack is empty or not.")
print("5. Exit")
choice = int(input("Enter your choice: "))
if choice == 1:
data = int(input("Enter an element to insert in the Stack : "))
stack.push(data)
print(stack.items)
elif choice == 2:
stack.pop()
print("Stack after pop : ", stack.items)
elif choice == 3:
print(stack.peek())
elif choice == 4:
print(stack.is_empty())
elif choice == 5:
break
else:
print("Invalid choice. Please try again.")
3. Write a Python program which takes a postfix expression as argument and evaluate
it using Stack. Write the corresponding algorithm.
class Stack:
def __init__(self):
self.items = []
def pop(self):
if not self.is_empty():
return self.items.pop()
else:
raise IndexError("pop from empty stack")
def peek(self):
if not self.is_empty():
return self.items[-1]
else:
raise IndexError("peek from empty stack")
def is_empty(self):
return len(self.items) == 0
def evaluate_postfix(expression):
stack = Stack()
operators = set(['+', '-', '*', '/'])
return stack.pop()
def infix_to_postfix(expression):
precedence = {'+': 1, '-': 1, '*': 2, '/': 2, '^': 3}
stack = []
postfix = []
for char in expression:
if char.isalnum():
postfix.append(char)
elif char == '(':
stack.append(char)
elif char == ')':
while stack and stack[-1] != '(':
postfix.append(stack.pop())
stack.pop()
else:
while stack and precedence.get(stack[-1], 0) >= precedence.get(char,
0):
postfix.append(stack.pop())
stack.append(char)
while stack:
postfix.append(stack.pop())
return ''.join(postfix)
def evaluate_postfix(expression):
stack = []
for char in expression:
if char.isdigit():
stack.append(int(char))
else:
operand2 = stack.pop()
operand1 = stack.pop()
if char == '+':
stack.append(operand1 + operand2)
elif char == '-':
stack.append(operand1 - operand2)
elif char == '*':
stack.append(operand1 * operand2)
elif char == '/':
stack.append(operand1 / operand2)
elif char == '^':
stack.append(operand1 ** operand2)
return stack.pop()
postfix_expr = input("Enter a postfix expression: ")
result = evaluate_postfix(postfix_expr)
print("Postfix Expression:", postfix_expr)
print("Result:", result)
6. Write a program to create a linked list to contain the vowels ‘a’, ‘e’, ‘i’,
‘o’, ‘u’ in the data field of the nodes.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def display(self):
current = self.head
while current:
print(current.data, end=" ")
current = current.next
print()
7. Write a program to delete the first node that contains an integer data item of a
single linked list.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def delete_first_integer_node(self):
if self.head is None:
return
if isinstance(self.head.data, int):
self.head = self.head.next
return
current = self.head
while current.next:
if isinstance(current.next.data, int):
current.next = current.next.next
return
current = current.next
def display(self):
current = self.head
while current:
print(current.data, end=" ")
current = current.next
print()
ll = LinkedList()
ll.insert_at_end('a')
ll.insert_at_end('e')
ll.insert_at_end(1)
ll.insert_at_end('i')
ll.insert_at_end('o')
ll.insert_at_end(2)
ll.insert_at_end('u')
class Node:
def __init__(self, data):
self.data = data
self.next = None
class Stack:
def __init__(self):
self.top = None
def pop(self):
if self.is_empty():
raise IndexError("pop from empty stack")
popped = self.top
self.top = self.top.next
popped.next = None
return popped.data
def peek(self):
if self.is_empty():
raise IndexError("peek from empty stack")
return self.top.data
def is_empty(self):
return self.top is None
def __str__(self):
current = self.top
stack_str = ""
while current:
stack_str += str(current.data) + " "
current = current.next
return stack_str.strip()
stack = Stack()
stack.push(10)
stack.push(20)
stack.push(30)
print("Stack:", stack)
print("Peek:", stack.peek())
print("Pop:", stack.pop())
print("Stack after pop:", stack)
class Node:
def __init__(self, data):
self.data = data
self.next = None
class Queue:
def __init__(self):
self.front = None
self.rear = None
def dequeue(self):
if self.is_empty():
raise IndexError("dequeue from empty queue")
dequeued = self.front
self.front = self.front.next
if self.front is None:
self.rear = None
dequeued.next = None
return dequeued.data
def peek(self):
if self.is_empty():
raise IndexError("peek from empty queue")
return self.front.data
def is_empty(self):
return self.front is None
def __str__(self):
current = self.front
queue_str = ""
while current:
queue_str += str(current.data) + " "
current = current.next
return queue_str.strip()
queue = Queue()
queue.enqueue(100)
queue.enqueue(200)
queue.enqueue(300)
print("Queue:", queue)
print("Peek:", queue.peek())
print("Dequeue:", queue.dequeue())
print("Queue after dequeue:", queue)
10. Write a Python program that implements circular queue as a linked list.
CODE :
class Node:
def __init__(self, data):
self.data = data
self.next = None
class CircularQueue:
def __init__(self, capacity):
self.capacity = capacity
self.size = 0
self.front = None
self.rear = None
def dequeue(self):
if self.is_empty():
raise IndexError("dequeue from empty queue")
dequeued = self.front
if self.size == 1:
self.front = None
self.rear = None
else:
self.front = self.front.next
self.rear.next = self.front
dequeued.next = None
self.size -= 1
return dequeued.data
def is_empty(self):
return self.size == 0
def is_full(self):
return self.size == self.capacity
def __str__(self):
if self.is_empty():
return "Empty queue"
current = self.front
queue_str = ""
while current.next != self.front:
queue_str += str(current.data) + " "
current = current.next
queue_str += str(current.data) + " "
return queue_str.strip()
queue = CircularQueue(5)
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
queue.enqueue(4)
queue.enqueue(5)
print("Queue:", queue)
print("Dequeue:", queue.dequeue())
print("Queue after dequeue:", queue)
queue.enqueue(6)
print("Queue after enqueue:", queue)
11. Write a Python program that implements deque using a linked list.
CODE :
class Node:
def __init__(self, data):
self.data = data
self.prev = None
self.next = None
class Deque:
def __init__(self):
self.front = None
self.rear = None
def is_empty(self):
return self.front is None
def remove_front(self):
if self.is_empty():
raise IndexError("remove_front from empty deque")
removed = self.front
if self.front == self.rear:
self.front = None
self.rear = None
else:
self.front = self.front.next
self.front.prev = None
removed.next = None
return removed.data
def remove_rear(self):
if self.is_empty():
raise IndexError("remove_rear from empty deque")
removed = self.rear
if self.front == self.rear:
self.front = None
self.rear = None
else:
self.rear = self.rear.prev
self.rear.next = None
removed.prev = None
return removed.data
def peek_front(self):
if self.is_empty():
raise IndexError("peek_front from empty deque")
return self.front.data
def peek_rear(self):
if self.is_empty():
raise IndexError("peek_rear from empty deque")
return self.rear.data
def __str__(self):
if self.is_empty():
return "Empty deque"
current = self.front
deque_str = ""
while current:
deque_str += str(current.data) + " "
current = current.next
return deque_str.strip()
deque = Deque()
deque.add_front(1)
deque.add_front(2)
deque.add_rear(3)
print("Deque:", deque)
print("Peek front:", deque.peek_front())
print("Peek rear:", deque.peek_rear())
print("Remove front:", deque.remove_front())
print("Deque after remove front:", deque)
print("Remove rear:", deque.remove_rear())
print("Deque after remove rear:", deque)
12. Write a Python program that implements a priority queue using a linked list.
class Node:
def __init__(self, data, priority):
self.data = data
self.priority = priority
self.next = None
class PriorityQueue:
def __init__(self):
self.head = None
def is_empty(self):
return self.head is None
def dequeue(self):
if self.is_empty():
raise IndexError("dequeue from empty priority queue")
dequeued = self.head
self.head = self.head.next
dequeued.next = None
return dequeued.data
def peek(self):
if self.is_empty():
raise IndexError("peek from empty priority queue")
return self.head.data
def __str__(self):
if self.is_empty():
return "Empty priority queue"
current = self.head
queue_str = ""
while current:
queue_str += f"{current.data}:{current.priority} "
current = current.next
return queue_str.strip()
priority_queue = PriorityQueue()
priority_queue.enqueue("Task1", 2)
priority_queue.enqueue("Task2", 1)
priority_queue.enqueue("Task3", 3)
print("Priority Queue:", priority_queue)
print("Peek:", priority_queue.peek())
print("Dequeue:", priority_queue.dequeue())
print("Priority Queue after dequeue:", priority_queue)