├── README.md ├── sakhtman1.py ├── tamrin2.py └── tm3_heapsort.py /README.md: -------------------------------------------------------------------------------- 1 | # tamrin_data-structure 2 | Data construction exercise 1 3 | -------------------------------------------------------------------------------- /sakhtman1.py: -------------------------------------------------------------------------------- 1 | class Queue: 2 | def __init__(self, max_size): 3 | self.max_size = max_size 4 | self.Q = [0] * max_size 5 | self.num = 0 6 | self.first = 0 7 | 8 | def enqueue(self, item): 9 | if self.num >= self.max_size: 10 | raise Exception("Queue overflow") 11 | self.Q[(self.num + self.first) % self.max_size] = item 12 | self.num += 1 13 | 14 | def dequeue(self): 15 | if self.num == 0: 16 | raise Exception("Queue empty") 17 | item = self.Q[self.first] 18 | self.first = (self.first + 1) % self.max_size 19 | self.num -= 1 20 | return item 21 | 22 | def front(self): 23 | if self.num == 0: 24 | raise Exception("Queue empty") 25 | return self.Q[self.first] 26 | 27 | def is_empty(self): 28 | return self.num == 0 29 | 30 | def size(self): 31 | return self.num 32 | 33 | def is_full(self): 34 | return self.num >= self.max_size 35 | 36 | def get_element_at(self, index): 37 | if index < 0 or index >= self.num: 38 | raise Exception("Index out of bounds") 39 | return self.Q[(self.first + index) % self.max_size] 40 | 41 | # Example usage 42 | q = Queue(10) 43 | q.enqueue("ra'na") 44 | q.enqueue("vez") 45 | q.enqueue("Arya") 46 | print("queue size is: ", q.size()) 47 | 48 | print(q.dequeue(), "left the queue") 49 | print("front of queue is:", q.front()) 50 | 51 | q.enqueue("milda") 52 | print("Element at index 1:", q.get_element_at(1)) # Assuming "Arya" is at index 1 after one dequeue 53 | 54 | q.dequeue() # Dequeue "vez" 55 | q.dequeue() # Dequeue "Arya" 56 | q.dequeue() # Dequeue "milda" 57 | print("It was a queue") 58 | -------------------------------------------------------------------------------- /tamrin2.py: -------------------------------------------------------------------------------- 1 | class Polynomial: 2 | class Node: 3 | def __init__(self, coeff, power): 4 | self.coefficient = coeff 5 | self.power = power 6 | self.next = None 7 | 8 | def __init__(self): 9 | self.head = None 10 | 11 | def add_term(self, coeff, power): 12 | if self.head is None: 13 | self.head = self.Node(coeff, power) 14 | else: 15 | current = self.head 16 | while current.next is not None: 17 | current = current.next 18 | current.next = self.Node(coeff, power) 19 | 20 | def add(self, poly1, poly2): 21 | result = Polynomial() 22 | current1 = poly1.head 23 | current2 = poly2.head 24 | 25 | while current1 is not None and current2 is not None: 26 | if current1.power > current2.power: 27 | result.add_term(current1.coefficient, current1.power) 28 | current1 = current1.next 29 | elif current1.power < current2.power: 30 | result.add_term(current2.coefficient, current2.power) 31 | current2 = current2.next 32 | else: 33 | result.add_term(current1.coefficient + current2.coefficient, current1.power) 34 | current1 = current1.next 35 | current2 = current2.next 36 | 37 | while current1 is not None: 38 | result.add_term(current1.coefficient, current1.power) 39 | current1 = current1.next 40 | 41 | while current2 is not None: 42 | result.add_term(current2.coefficient, current2.power) 43 | current2 = current2.next 44 | 45 | return result 46 | 47 | def multiply(self, poly1, poly2): 48 | result = Polynomial() 49 | current1 = poly1.head 50 | while current1 is not None: 51 | current2 = poly2.head 52 | while current2 is not None: 53 | result.add_term(current1.coefficient * current2.coefficient, current1.power + current2.power) 54 | current2 = current2.next 55 | current1 = current1.next 56 | return result 57 | 58 | def display(self): 59 | current = self.head 60 | if current is None: 61 | print("Empty polynomial") 62 | return 63 | while current is not None: 64 | print(f"| {current.coefficient}x^{current.power} ", end="") 65 | current = current.next 66 | print("|") 67 | 68 | 69 | # Example usage 70 | poly1 = Polynomial() 71 | poly1.add_term(2, 2) 72 | poly1.add_term(4, 1) 73 | poly1.add_term(6, 0) 74 | 75 | poly2 = Polynomial() 76 | poly2.add_term(1, 2) 77 | poly2.add_term(3, 1) 78 | poly2.add_term(5, 0) 79 | 80 | print("Polynomial 1:") 81 | poly1.display() 82 | print("Polynomial 2:") 83 | poly2.display() 84 | 85 | print("Addition result:") 86 | result_addition = Polynomial().add(poly1, poly2) 87 | result_addition.display() 88 | 89 | print("Multiplication result:") 90 | result_multiplication = Polynomial().multiply(poly1, poly2) 91 | result_multiplication.display() 92 | -------------------------------------------------------------------------------- /tm3_heapsort.py: -------------------------------------------------------------------------------- 1 | def heapify(arr, n, i): 2 | largest = i # Initialize largest as root 3 | left = 2 * i + 1 # left = 2*i + 1 4 | right = 2 * i + 2 # right = 2*i + 2 5 | 6 | # See if left child of root exists and is greater than root 7 | if left < n and arr[i] < arr[left]: 8 | largest = left 9 | 10 | # See if right child of root exists and is greater than root 11 | if right < n and arr[largest] < arr[right]: 12 | largest = right 13 | 14 | # Change root, if needed 15 | if largest != i: 16 | arr[i], arr[largest] = arr[largest], arr[i] # swap 17 | 18 | # Heapify the root. 19 | heapify(arr, n, largest) 20 | 21 | 22 | def heap_sort(arr): 23 | n = len(arr) 24 | 25 | # Build a maxheap. 26 | for i in range(n // 2 - 1, -1, -1): 27 | heapify(arr, n, i) 28 | 29 | # One by one extract elements 30 | for i in range(n-1, 0, -1): 31 | arr[i], arr[0] = arr[0], arr[i] # swap 32 | heapify(arr, i, 0) 33 | 34 | 35 | if __name__ == "__main__": 36 | # Get user input 37 | arr = list(map(int, input("Please enter the numbers separated by space: ").split())) 38 | 39 | print("Array before sorting:") 40 | print(arr) 41 | 42 | heap_sort(arr) 43 | 44 | print("Array after sorting:") 45 | print(arr) 46 | --------------------------------------------------------------------------------