# Leetcode MaxStack in python

My solution to Leetcode MaxStack in python in python. I have two solution one is using linked-list and another one is using list

Design a max stack that supports push, pop, top, peekMax and popMax.

push(x) — Push element x onto stack.
pop() — Remove the element on top of the stack and return it.
top() — Get the element on the top.
peekMax() — Retrieve the maximum element in the stack.
popMax() — Retrieve the maximum element in the stack, and remove it. If you find more than one maximum elements, only remove the top-most one.

Using list

``class MaxStack_list:     def __init__(self):         """         Initialize your data structure here.         """         self.head = []         self.max_val = None      def push(self, x):         """         Push element x onto stack.         :type x: int         :rtype: void         """         self.head.append(x)         self.max_val = max(max(self.head), x)      def pop(self):         """         Removes the element on top of the stack and returns that element.         :rtype: int         """         self.head.pop()         self.max_val = max(self.head)      def top(self):         """         Get the top element.         :rtype: int         """         return self.head[-1] if self.head else None      def peekMax(self):         """         Retrieve the maximum element in the stack.         :rtype: int         """         return self.max_val      def popMax(self):         """         Retrieve the maximum element in the stack, and remove it. If you find more than one maximum elements, only remove the top-most one.         :rtype: void         """         v = self.max_val         self.head.remove(self.max_val)         self.max_val = max(self.head)         return v ``

``class Node:     def __init__(self, x):         self.val = x         self.next = None   class MaxStack:     def __init__(self):         """         Initialize your data structure here.         """         self.head = None         self.max_val = None      def push(self, x):         """         Push element x onto stack.         :type x: int         :rtype: void         """         if self.head:             n = Node(x)             n.next = self.head             self.head = n         else:             self.head = Node(x)         self.max_val = max(x, self.max_val) if self.max_val or self.max_val == 0 else x      def pop(self):         """         Removes the element on top of the stack and returns that element.         :rtype: int         """         rtn = None         if self.head:             rtn = self.head.val             self.head = self.head.next          head = self.head         v = head.val if head else None         while head:             v = max(v, head.val)             head = head.next         self.max_val = v         return rtn      def top(self):         """         Get the top element.         :rtype: int         """         if self.head:             return self.head.val      def peekMax(self):         """         Retrieve the maximum element in the stack.         :rtype: int         """         return self.max_val      def popMax(self):         """         Retrieve the maximum element in the stack, and remove it. If you find more than one maximum elements, only remove the top-most one.         :rtype: void         """         prev, cur = None, self.head         while cur:             if cur.val == self.max_val and cur == self.head:                 self.head = cur.next                 tmp = cur                 break             elif cur.val == self.max_val:                 prev.next = cur.next                 break              prev, cur = cur, cur.next          cur = self.head         tmp = self.max_val         v = cur.val if cur else None         while cur:             if cur:                 v = max(v, cur.val)             cur = cur.next         self.max_val = v         return tmp ``