From a6a9cbccc3666ffdbf0e2a4afdb312aeddd6c024 Mon Sep 17 00:00:00 2001 From: Chau Long Do Date: Wed, 4 May 2022 11:42:26 +0700 Subject: [PATCH] Create stack_with_max_advanced.py this implementation uses double linked list and it takes O(n) for all operations. It can be also used deque why deque is quietly similar to double linked list --- .../stack_with_max_advanced.py | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 2. Data Structures/Week-1-Basic Data Structures/4_stack_with_max/stack_with_max_advanced.py diff --git a/2. Data Structures/Week-1-Basic Data Structures/4_stack_with_max/stack_with_max_advanced.py b/2. Data Structures/Week-1-Basic Data Structures/4_stack_with_max/stack_with_max_advanced.py new file mode 100644 index 0000000..32425e0 --- /dev/null +++ b/2. Data Structures/Week-1-Basic Data Structures/4_stack_with_max/stack_with_max_advanced.py @@ -0,0 +1,59 @@ +#python3 +import sys + +class Node: + def __init__(self, val, max_elem, prev=None, next=None): + self.val = val + self.max_elem = max_elem + self.prev = prev + self.next = next + +class StackWithMax(): + def __init__(self): + self.head = Node(-1, -1) + self.tail = Node(-1, -1) + self.head.next = self.tail + self.tail.prev = self.head + self.len = 0 + + def Push(self, a): + if not self.len: + node = Node(a, a, self.head, self.tail) + self.head.next = node + self.tail.prev = node + else: + prev_node = self.tail.prev + node = Node(a, max(a, prev_node.max_elem), prev_node, self.tail) + prev_node.next = node + self.tail.prev = node + self.len += 1 + + def Pop(self): + if self.len: + prev_node = self.tail.prev + prev_prev_node = prev_node.prev + prev_prev_node.next = self.tail + self.tail.prev = prev_prev_node + self.len -= 1 + + def Max(self): + if self.len: + prev_node = self.tail.prev + return prev_node.max_elem + + +if __name__ == '__main__': + stack = StackWithMax() + + num_queries = int(sys.stdin.readline()) + for _ in range(num_queries): + query = sys.stdin.readline().split() + + if query[0] == "push": + stack.Push(int(query[1])) + elif query[0] == "pop": + stack.Pop() + elif query[0] == "max": + print(stack.Max()) + else: + assert(0)