0% found this document useful (0 votes)
9 views

Assignment 3

Uploaded by

xi.am3cs09
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
9 views

Assignment 3

Uploaded by

xi.am3cs09
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 20

DSA ASSIGNMENT NUMBER 03

Name: Sarah Iqbal

class_id: 114724

student_id: 15312

question 01:

class Stack:

def _init_(self):

self.items = []

def is_empty(self):

return len(self.items) == 0

def push(self, item):

self.items.append(item)

def pop(self):

if not self.is_empty():

return self.items.pop()

return None

def peek(self):

if not self.is_empty():

return self.items[-1]

return None

def precedence(op):

if op in ('+', '-'):
return 1

if op in ('*', '/'):

return 2

if op == '^':

return 3

return 0

def is_operand(char):

return char.isalpha()

def infix_to_postfix(expression):

stack = Stack()

result = []

for char in expression:

if is_operand(char):

result.append(char)

elif char == '(':

stack.push(char)

elif char == ')':

top_token = stack.pop()

while top_token != '(':

result.append(top_token)

top_token = stack.pop()

else:

while not stack.is_empty() and precedence(char) <= precedence(stack.peek()):

result.append(stack.pop())

stack.push(char)
while not stack.is_empty():

result.append(stack.pop())

return ' '.join(result)

expression1 = "(A+B)*C-(D-E)^(F+G)"

expression2 = "A*(B+C)/D-E"

print("Postfix of expression 1:", infix_to_postfix(expression1))

print("Postfix of expression 2:", infix_to_postfix(expression2))

question 02:

class Stack:
def __init__(self):
self.items = []
def is_empty(self):
return len(self.items) == 0
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop() if not self.is_empty() else None
def peek(self):
return self.items[-1] if not self.is_empty() else None
def get_precedence(op):
precedences = {'+': 1, '-': 1, '*': 2, '/': 2, '^': 3}
return precedences.get(op, 0)
def is_operand(char):
return char.isalnum()
def infix_to_postfix(expression):
stack = Stack()
result = []
for char in expression:
if is_operand(char):
result.append(char)
elif char == '(':
stack.push(char)
elif char == ')':
while not stack.is_empty() and stack.peek() != '(':
result.append(stack.pop())
stack.pop()
else:
while not stack.is_empty() and get_precedence(char) <=
get_precedence(stack.peek()):
result.append(stack.pop())
stack.push(char)
while not stack.is_empty():
result.append(stack.pop())
return ''.join(result)
def infix_to_prefix(expression):
def reverse_and_swap(expression):
expression = expression[::-1]
return ''.join(['(' if char == ')' else ')' if char == '(' else char for char in expression])
def modified_infix_to_postfix(expression):
stack = Stack()
result = []
for char in expression:
if is_operand(char):
result.append(char)
elif char == '(':
stack.push(char)
elif char == ')':
while not stack.is_empty() and stack.peek() != '(':
result.append(stack.pop())
stack.pop()
else:
while not stack.is_empty() and get_precedence(char) <
get_precedence(stack.peek()):
result.append(stack.pop())
stack.push(char)
while not stack.is_empty():
result.append(stack.pop())
return ' '.join(result)
reversed_expression = reverse_and_swap(expression)
postfix_expression = modified_infix_to_postfix(reversed_expression)
return reverse_and_swap(postfix_expression)
expression1 = "(X+Y)*(Z-W)"
expression2 = "M*N+O/P"
expression3 = "P+Q-R*S"
print("Prefix of expression 1:", infix_to_prefix(expression1))
print("Prefix of expression 2:", infix_to_prefix(expression2))
print("Prefix of expression 3:", infix_to_prefix(expression3))
question 03:

class Stack:

def __init__(self):

self.items = []

def is_empty(self):

return len(self.items) == 0

def push(self, item):

self.items.append(item)

def pop(self):

return self.items.pop() if not self.is_empty() else None

def peek(self):

return self.items[-1] if not self.is_empty() else None

def power(base, exponent):

result = 1

for _ in range(exponent):

result *= base

return result

def multiply(a, b):

result = 0
for _ in range(b):

result += a

return result

def precedence(op):

if op in ('+', '-'):

return 1

if op in ('*', '/'):

return 2

if op == '^':

return 3

return 0

def is_operand(char):

return char.isdigit()

def infix_to_postfix(expression):

stack = Stack()

result = []

i=0

while i < len(expression):

char = expression[i]

if char.isdigit():

num = char

while i + 1 < len(expression) and expression[i + 1].isdigit():

i += 1

num += expression[i]

result.append(num)
elif char == '(':

stack.push(char)

elif char == ')':

top_token = stack.pop()

while top_token != '(':

result.append(top_token)

top_token = stack.pop()

else:

while not stack.is_empty() and precedence(char) <= precedence(stack.peek()):

result.append(stack.pop())

stack.push(char)

i += 1

while not stack.is_empty():

result.append(stack.pop())

return result

def evaluate_postfix(expression):

stack = Stack()

for char in expression:

if char.isdigit():

stack.push(int(char))

else:

if char == '^':

op1 = stack.pop()

op2 = stack.pop()

stack.push(power(op2, op1))
elif char == '*':

op1 = stack.pop()

op2 = stack.pop()

stack.push(multiply(op2, op1))

elif char == '+':

op1 = stack.pop()

op2 = stack.pop()

stack.push(op1 + op2)

elif char == '-':

op1 = stack.pop()

op2 = stack.pop()

stack.push(op2 - op1)

return stack.pop()

expression1 = "3 + 2 ^ 2 ^ 2 - 2 * 3"

expression2 = "5 + 1 ^ 3 ^ 2 - 4 * 2"

expression3 = "7 + 1 ^ 4 ^ 1 - 3 * 2"

postfix_expression1 = infix_to_postfix(expression1.replace(" ", ""))

postfix_expression2 = infix_to_postfix(expression2.replace(" ", ""))

postfix_expression3 = infix_to_postfix(expression3.replace(" ", ""))

print("Result of expression 1:", evaluate_postfix(postfix_expression1))

print("Result of expression 2:", evaluate_postfix(postfix_expression2))

print("Result of expression 3:", evaluate_postfix(postfix_expression3))


question 04:

class Stack:

def __init__(self):

self.stack = []

def push(self, item):

self.stack.append(item)

def pop(self):

return self.stack.pop() if not self.is_empty() else None

def is_empty(self):

return len(self.stack) == 0

def peek(self):

return self.stack[-1] if not self.is_empty() else None

def evaluate_postfix(expression):

stack = Stack()

tokens = expression.split()

for token in tokens:

if token.isdigit():

stack.push(int(token))

else:

right_operand = stack.pop()

left_operand = stack.pop()

if token == '+':

stack.push(left_operand + right_operand)
elif token == '-':

stack.push(left_operand - right_operand)

elif token == '*':

stack.push(left_operand * right_operand)

elif token == '/':

stack.push(left_operand // right_operand)

elif token == '^':

stack.push(left_operand ** right_operand)

return stack.pop()

expression1 = "4 2 + 3 5 1 - * +"

expression2 = "7 3 2 * + 4 2 ^ -"

expression3 = "2 3 ^ 5 4 * + 8 4 / -"

result1 = evaluate_postfix(expression1)

result2 = evaluate_postfix(expression2)

result3 = evaluate_postfix(expression3)

print("Result of expression 1:", result1)

print("Result of expression 2:", result2)

print("Result of expression 3:", result3)

question 05:

def evaluate_prefix(expr):

stack = []
tokens = expr.split()[::-1]

for token in tokens:

if token.isdigit():

stack.append(int(token))

else:

operand1 = stack.pop()

operand2 = stack.pop()

if token == '+':

stack.append(operand1 + operand2)

elif token == '-':

stack.append(operand1 - operand2)

elif token == '*':

stack.append(operand1 * operand2)

elif token == '/':

stack.append(operand1 / operand2)

elif token == '^':

stack.append(operand1 ** operand2)

return stack.pop()

expression = "* + 5 6 - 7 3"

result = evaluate_prefix(expression)

print(f"Result of prefix expression '{expression}': {result}")

expression2 = "- + 3 5 / 8 2"

result2 = evaluate_prefix(expression2)
print(f"Result of prefix expression '{expression2}': {result2}")

expression3 = "+ 2 * 3 + 4 5"

result3 = evaluate_prefix(expression3)

print(f"Result of prefix expression '{expression3}': {result3}")

question 06:

class Node:

def __init__(self, data):

self.data = data

self.prev = None

self.next = None

class DoublyLinkedList:

def __init__(self):

self.head = None

def add_node(self, data):

newNode = Node(data)

if not self.head:

self.head = newNode

return

temp = self.head

while temp.next:

temp = temp.next

temp.next = newNode
newNode.prev = temp

def traverse_forward(self):

temp = self.head

while temp:

print(temp.data, end=" ")

temp = temp.next

print()

dll = DoublyLinkedList()

dll.add_node(8)

dll.add_node(12)

dll.add_node(15)

dll.add_node(18)

print("Traversing the doubly linked list in forward direction:")

dll.traverse_forward()

question 07:

class Node:

def __init__(self, data):

self.data = data

self.prev = None

self.next = None

class DoublyLinkedList:

def __init__(self):
self.head = None

def add_node(self, data):

newNode = Node(data)

if not self.head:

self.head = newNode

return

temp = self.head

while temp.next:

temp = temp.next

temp.next = newNode

newNode.prev = temp

def traverse_backward(self):

if not self.head:

return

temp = self.head

while temp.next:

temp = temp.next

while temp:

print(temp.data, end=" ")

temp = temp.prev

print()

dll = DoublyLinkedList()

dll.add_node(14)

dll.add_node(18)

dll.add_node(22)
dll.add_node(26)

print("Traversing the doubly linked list in backward direction:")

dll.traverse_backward()

question 08:

class Node:

def __init__(self, data):

self.data = data

self.next = None

class SinglyLinkedList:

def __init__(self):

self.head = None

def add_node(self, data):

new_node = Node(data)

if not self.head:

self.head = new_node

return

temp = self.head

while temp.next:

temp = temp.next

temp.next = new_node

def delete_node(self, loc):

if not self.head:
print("The list is empty.")

return

if loc < 1:

print("Invalid location.")

return

temp = self.head

if loc == 1:

self.head = temp.next

temp = None

return

for _ in range(loc - 2):

if temp.next:

temp = temp.next

else:

print("Invalid location.")

return

if not temp.next:

print("Invalid location.")

return

next_node = temp.next.next

temp.next = None

temp.next = next_node

def print_list(self):

temp = self.head

while temp:
print(temp.data, end=" ")

temp = temp.next

print()

sll = SinglyLinkedList()

sll.add_node(35)

sll.add_node(27)

sll.add_node(18)

sll.add_node(45)

print("Original list:")

sll.print_list()

loc = 3

sll.delete_node(loc)

print(f"List after deleting node at location {loc}:")

sll.print_list()

question 09:

class Stack:

def __init__(self):

self.stack = []

def is_empty(self):

return len(self.stack) == 0

def push(self, item):


self.stack.append(item)

def pop(self):

return self.stack.pop() if not self.is_empty() else None

def peek(self):

return self.stack[-1] if not self.is_empty() else None

def size(self):

return len(self.stack)

def sort_stack(self):

temp_stack = Stack()

while not self.is_empty():

temp = self.pop()

while not temp_stack.is_empty() and temp_stack.peek() > temp:

self.push(temp_stack.pop())

temp_stack.push(temp)

while not temp_stack.is_empty():

self.push(temp_stack.pop())

def print_stack(self):

for item in reversed(self.stack):

print(item, end=" ")

print()

s = Stack()

s.push(54)

s.push(29)

s.push(17)

s.push(63)
s.push(42)

s.push(77)

print("Original stack:")

s.print_stack()

s.sort_stack()

print("Sorted stack:")

s.print_stack()

You might also like