Assignment 3
Assignment 3
class_id: 114724
student_id: 15312
question 01:
class Stack:
def _init_(self):
self.items = []
def is_empty(self):
return len(self.items) == 0
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 = []
if is_operand(char):
result.append(char)
stack.push(char)
top_token = stack.pop()
result.append(top_token)
top_token = stack.pop()
else:
result.append(stack.pop())
stack.push(char)
while not stack.is_empty():
result.append(stack.pop())
expression1 = "(A+B)*C-(D-E)^(F+G)"
expression2 = "A*(B+C)/D-E"
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
self.items.append(item)
def pop(self):
def peek(self):
result = 1
for _ in range(exponent):
result *= base
return result
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
char = expression[i]
if char.isdigit():
num = char
i += 1
num += expression[i]
result.append(num)
elif char == '(':
stack.push(char)
top_token = stack.pop()
result.append(top_token)
top_token = stack.pop()
else:
result.append(stack.pop())
stack.push(char)
i += 1
result.append(stack.pop())
return result
def evaluate_postfix(expression):
stack = Stack()
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))
op1 = stack.pop()
op2 = stack.pop()
stack.push(op1 + op2)
op1 = stack.pop()
op2 = stack.pop()
stack.push(op2 - op1)
return stack.pop()
class Stack:
def __init__(self):
self.stack = []
self.stack.append(item)
def pop(self):
def is_empty(self):
return len(self.stack) == 0
def peek(self):
def evaluate_postfix(expression):
stack = Stack()
tokens = expression.split()
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)
stack.push(left_operand * right_operand)
stack.push(left_operand // right_operand)
stack.push(left_operand ** right_operand)
return stack.pop()
result1 = evaluate_postfix(expression1)
result2 = evaluate_postfix(expression2)
result3 = evaluate_postfix(expression3)
question 05:
def evaluate_prefix(expr):
stack = []
tokens = expr.split()[::-1]
if token.isdigit():
stack.append(int(token))
else:
operand1 = stack.pop()
operand2 = stack.pop()
if token == '+':
stack.append(operand1 + operand2)
stack.append(operand1 - operand2)
stack.append(operand1 * operand2)
stack.append(operand1 / operand2)
stack.append(operand1 ** operand2)
return stack.pop()
result = evaluate_prefix(expression)
result2 = evaluate_prefix(expression2)
print(f"Result of prefix expression '{expression2}': {result2}")
result3 = evaluate_prefix(expression3)
question 06:
class Node:
self.data = data
self.prev = None
self.next = None
class DoublyLinkedList:
def __init__(self):
self.head = None
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:
temp = temp.next
print()
dll = DoublyLinkedList()
dll.add_node(8)
dll.add_node(12)
dll.add_node(15)
dll.add_node(18)
dll.traverse_forward()
question 07:
class Node:
self.data = data
self.prev = None
self.next = None
class DoublyLinkedList:
def __init__(self):
self.head = None
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:
temp = temp.prev
print()
dll = DoublyLinkedList()
dll.add_node(14)
dll.add_node(18)
dll.add_node(22)
dll.add_node(26)
dll.traverse_backward()
question 08:
class Node:
self.data = data
self.next = None
class SinglyLinkedList:
def __init__(self):
self.head = None
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
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
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)
sll.print_list()
question 09:
class Stack:
def __init__(self):
self.stack = []
def is_empty(self):
return len(self.stack) == 0
def pop(self):
def peek(self):
def size(self):
return len(self.stack)
def sort_stack(self):
temp_stack = Stack()
temp = self.pop()
self.push(temp_stack.pop())
temp_stack.push(temp)
self.push(temp_stack.pop())
def print_stack(self):
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()