all
# class Node to store order id, items and the due time class Node: def __init__(self, order, items, due_time): self.order = order self.items = items self.due_time = due_time self.next = None class Delivery: def __init__(self): self.front = self.rear = None # method to place order. orders are placed at the rear of the queue def place_order(self, order, items, due_time): node = Node(order, items, due_time) if self.front is None: self.front = self.rear = node return else: self.rear.next = node self.rear = self.rear.next # method to dequeue a data from the front of the queue def dispatch_front(self): if self.front is None: print("There are no orders yet") return else: # decrement the due time by 1 of each orders current = self.front while current: current.due_time -= 1 current = current.next id = self.front.order self.front = self.front.next print(f'Dispatched Order Id: {id}') # method to dequeue a data from the rear of the queue def dispatch_rear(self): if self.front is None: print("There are no orders yet") return # decrement the due time by 1 of each orders current = self.front while current: current.due_time -= 1 current = current.next current = self.front while current.next != self.rear: current = current.next id = current.next.order current.next = None self.rear = current print(f'Dispatched Order Id: {id}') # method to check for late orders and move them to the front of the Deque def late_handling(self): current = self.front if self.front is None: print("There are no orders yet") return while current.next: # remove the orders that due times are below 0 then move them back to the front of the queue if current.next.due_time < 0: order = current.next.order due_time = current.next.due_time items = current.next.items current.next = current.next.next order = Node(order, items, due_time) order.next = self.front self.front = order continue current = current.next print('Late orders are updated') # method to display the current status of the order queue def view_orders(self): print() current = self.front if self.front is None: print("There are no orders yet") return else: while current: print(f'Order ID: {current.order}\tItems: {current.items}\tDue time: {current.due_time}') current = current.next print() # method to dequeue orders from both ends of the Deque. def process_orders(self): if self.front is None: print("There are no orders yet") return else: id1 = self.front.order id2 = self.rear.order self.front = self.front.next current = self.front while current.next != self.rear: current = current.next current.next = None self.rear = current print(f'Processed Order IDs are: {id1} and {id2}') # Calculate and return the delivery time of a specific order in the queue def delivery_time(self, order): time = 1 current = self.front if self.front is None: return "There are no orders yet" elif self.front.order == order: return f'Delivery time of order id {order}: {time}' else: while current: if current.order != order: time += 1 else: return f'Delivery time of order id {order}: {time}' current = current.next return 'The order id is not on the queue' d = Delivery() d.place_order(123, 'bag', 5) d.place_order(321, 'pen', 3) d.place_order(891, 'pin', 1) d.place_order(642, 'bag', 1) d.place_order(777, 'pen', 4) d.place_order(900, 'pin', 6) d.view_orders() d.dispatch_front() d.view_orders() d.dispatch_rear() d.view_orders() d.late_handling() d.view_orders() d.process_orders() d.view_orders() print(d.delivery_time(321)) ############## Priority class Node: def __init__(self, data, priority=None): self.data = data self.priority = priority self.next = None class Prio: def __init__(self): self.front = self.rear = None def enqueue(self, data, priority=None): node = Node(data, priority) if self.front is None: self.front = self.rear = node else: if self.front.priority is None or self.rear.priority and priority < self.front.priority: node.next = self.front self.front = node elif priority is None or self.rear.priority is not None and priority > self.rear.priority: self.rear.next = node self.rear = node else: current = self.front while current.next: if current.next.priority is None or current.next.priority > priority: node.next = current.next current.next = node break current = current.next def display(self): current = self.front while current: print(current.data, current.priority, ' ', end='') current = current.next p = Prio() p.enqueue(12,2) p.enqueue(13,3) p.enqueue(132,1) p.enqueue(1324,4) p.enqueue(13214,0) p.display() ####### concatenate, palindrome class Node: def __init__(self, data): self.data = data self.next = None class Stack: def __init__(self): self.top = None def push(self, data): node = Node(data) node.next = self.top self.top = node def pop(self): popped_data = self.top.data self.top = self.top.next return popped_data def peek(self): if self.top is None: return None else: return self.top.data def is_palindrome(self, str1): for i in str1: self.push(i) for i in str1: if i == self.peek(): self.pop() else: self.pop() return False return True def backtrack(self): current = self.top while current: if current.data < 0: for i in range(5): self.pop() current = current.next def concatenate(self, other_stack): if other_stack.top is None: return # Traverse to the end of the current stack current = self.top while current.next: current = current.next # Concatenate the other stack to the end of the current stack current.next = other_stack.top # Clear the other stack after concatenation other_stack.top = None def display(self): current = self.top while current: print(current.data, '', end='') current = current.next def min(self): current = self.top minimum = self.top.data while current: if minimum < current.data: minimum = minimum else: minimum = current.data current = current.next return minimum def max(self): current = self.top maximum = self.top.data while current: if maximum > current.data: maximum = maximum else: maximum = current.data current = current.next return maximum def is_empty(self): return self.top is None def size(self): count = 0 current = self.top while current: count += 1 current = current.next return count def clear(self): self.top = None def search(self, data): current = self.top position = 0 while current: if current.data == data: return position position += 1 current = current.next return None def reverse(self): temp_stack = Stack() while self.top: temp_stack.push(self.pop()) self.top = temp_stack.top def copy(self): copied_stack = Stack() current = self.top while current is not None: copied_stack.push(current.data) current = current.next return copied_stack stack = Stack() stack1 = Stack() stack.push(0) stack.push(2) stack.push(4) stack.push(8) stack.display() print() print('Minimum', stack.min()) print('Maximum', stack.max()) ######## Is Balance class Node: def __init__(self, data): self.data = data self.next = None class Stack: def __init__(self): self.top = None def push(self, data): node = Node(data) node.next = self.top self.top = node def pop(self): if self.top is None: return None popped_data = self.top.data self.top = self.top.next return popped_data def peek(self): if self.top is None: return None else: return self.top.data def is_balanced_parentheses(s): stack = Stack() # Iterate through each character in the string for char in s: if char in "({[": stack.push(char) elif char in ")}]": # Check if the stack is empty (unmatched closing parenthesis) if stack.peek() is None: return False # Check if the current closing parenthesis matches the top of the stack if (char == ")" and stack.peek() == "(") or \ (char == "}" and stack.peek() == "{") or \ (char == "]" and stack.peek() == "["): stack.pop() else: return False # Check if there are unmatched opening parentheses return stack.peek() is None # Test cases print(is_balanced_parentheses("()")) # True print(is_balanced_parentheses("()[]{}")) # True print(is_balanced_parentheses("(]")) # False print(is_balanced_parentheses("([)]")) # False print(is_balanced_parentheses("{[]}")) # True ##### infix to postfix class Node: def __init__(self, data): self.data = data self.next = None class Stack: def __init__(self): self.top = None def push(self, data): node = Node(data) node.next = self.top self.top = node def pop(self): popped = self.top.data self.top = self.top.next return popped def peek(self): if self.top is None: return None else: return self.top.data def display(self): current = self.top while current: print(current.data, '', end='') current = current.next def is_balance(self, str1): open_brackets = '[{(' close_brackets = ']})' for i in str1: if i in open_brackets: self.push(i) elif i in close_brackets: if i == ')' and self.peek() == '(' or i == '}' and self.peek() == '{' or i == ']' and self.peek() == '[': self.pop() else: return False if self.peek() is None: return True else: return False def remove_wspace(self, str1): new = '' for i in str1: if i != ' ': new += i return new def infix_postfix(self, str1): if self.is_balance(str1): nospace = self.remove_wspace(str1) operator = '+-*/()^' expression = '' for i in nospace: if i in operator: if (i == '-' or i == '+') and (self.peek() == '*' or self.peek() == '/' or self.peek() == '^'): while self.peek() is not None and (self.peek() == '*' or self.peek() == '/' or self.peek() == '^'): temp = self.pop() expression += temp if (i == '-' or i == '+') and (self.peek() == '-' or self.peek() == '+'): while self.peek() is not None and (self.peek() == '-' or self.peek() == '+'): temp = self.pop() expression += temp self.push(i) elif i == ')': while self.peek() is not None and self.peek() != '(': temp = self.pop() expression += temp self.pop() # Pop the open parenthesis elif (i == '-' or i == '+') and (self.peek() == '-' or self.peek() == '+'): while self.peek() is not None and (self.peek() == '-' or self.peek() == '+'): temp = self.pop() expression += temp self.push(i) elif (i == '*' or i == '/') and (self.peek() == '*' or self.peek() == '/' or self.peek() == '^'): while self.peek() is not None and (self.peek() == '*' or self.peek() == '/' or self.peek() == '^'): temp = self.pop() expression += temp self.push(i) elif i == '^' and self.peek() == '^': self.push(i) else: self.push(i) else: expression += i while self.peek() is not None: temp = self.pop() expression += temp return expression else: print('Not balance') return False stack = Stack() print(stack.infix_postfix('((f*g-h)+(i*(j/k-l))+(m*n/o)')) ###### infix to postfix class Node: def __init__(self, data): self.data = data self.next = None class Stack: def __init__(self): self.top = None def push(self, data): node = Node(data) node.next = self.top self.top = node def pop(self): popped = self.top.data self.top = self.top.next return popped def peek(self): if self.top is None: return None else: return self.top.data def display(self): current = self.top while current: print(current.data, '', end='') current = current.next def is_balance(self, str1): open_brackets = '[{(' close_brackets = ']})' for i in str1: if i in open_brackets: self.push(i) elif i in close_brackets: if i == ')' and self.peek() == '(' or i == '}' and self.peek() == '{' or i == ']' and self.peek() == '[': self.pop() else: return False if self.peek() is None: return True else: return False def reverse(self, str1): new = '' prev = '' for i in str1: if prev == ')' and i == '(': new = i + '*' +new else: new = i + new prev = i return new def remove_space(self, str1): new = '' for i in str1: if i != ' ': new += i return new def infix_prefix(self, str1): if self.is_balance(str1): final = self.remove_space(str1) reverse = self.reverse(final) operator = '+-*/()^[]{}' expression = '' for i in reverse: if i in operator: if (i == '-' or i == '+') and (self.peek() == '*' or self.peek() == '/' or self.peek() == '^'): while self.peek() == '*' or self.peek() == '/' or self.peek() == '^': temp = self.pop() expression += temp self.push(i) elif (i == '*' or i == '/' or i == '^') and (self.peek() == '^'): temp = self.pop() expression += temp self.push(i) elif i == '(': while self.peek() != ')': temp = self.pop() expression += temp self.pop() elif i == '[': while self.peek() != ']': temp = self.pop() expression += temp self.pop() elif i == '{': while self.peek() != '}': temp = self.pop() expression += temp self.pop() else: self.push(i) else: expression += i while self.peek() is not None: temp = self.pop() expression += temp return self.reverse(expression) else: print('Not balance') return False stack = Stack() print('Infix to Prefix\n', stack.infix_prefix('((a+b)*c)-(d*e/(f+g))-(h*i)')) stack.display()
Leave a Comment