HardNo. 0716LeetCode Premium
Max Stack — LeetCode 716 Python Solution
- Pattern
- Linked List
- Topics
- Stack, Design, Linked List, Doubly-Linked List, Ordered Set
- Reading time
- 12 min
- Source
- leetcode.com
The problem
Design a max stack data structure that supports the stack operations and supports finding the stack's maximum element. Implement the MaxStack class: MaxStack() Initializes the stack object.
Example
- Input
- ["MaxStack", "push", "push", "push", "top", "popMax", "top", "peekMax", "pop", "top"]
- Output
- [null, null, null, null, 5, 5, 1, 5, 1, 5]
- Explanation
- MaxStack stk = new MaxStack();
Python solution
class Node:
def __init__(self, val=0):
self.val = val
self.prev: Union[Node, None] = None
self.next: Union[Node, None] = None
class DoubleLinkedList:
def __init__(self):
self.head = Node()
self.tail = Node()
self.head.next = self.tail
self.tail.prev = self.head
def append(self, val) -> Node:
node = Node(val)
node.next = self.tail
node.prev = self.tail.prev
self.tail.prev = node
node.prev.next = node
return node
@staticmethod
def remove(node) -> Node:
node.prev.next = node.next
node.next.prev = node.prev
return node
def pop(self) -> Node:
return self.remove(self.tail.prev)
def peek(self):
return self.tail.prev.val
class MaxStack:
def __init__(self):
self.stk = DoubleLinkedList()
self.sl = SortedList(key=lambda x: x.val)
def push(self, x: int) -> None:
node = self.stk.append(x)
self.sl.add(node)
def pop(self) -> int:
node = self.stk.pop()
self.sl.remove(node)
return node.val
def top(self) -> int:
return self.stk.peek()
def peekMax(self) -> int:
return self.sl[-1].val
def popMax(self) -> int:
node = self.sl.pop()
DoubleLinkedList.remove(node)
return node.val
# Your MaxStack object will be instantiated and called as such:
# obj = MaxStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.peekMax()
# param_5 = obj.popMax()Complexity
- Time
- O(n)
- Space · auxiliary
- O(n)
Pattern: Linked List
Rewire pointers in place, with a dummy head and a saved next to keep it safe. LeetCode 716. Max Stack is filed here because LeetCode tags it Linked List and Doubly-Linked List, which is the vocabulary this hub collects.
The linked list guide has the Python template for the pattern and the 75 LeetCode problems that use it.
Related problems
| No. | Problem | Difficulty |
|---|---|---|
| 1472 | Design Browser History | Medium |
| 2296 | Design a Text Editor | Hard |
| 0114 | Flatten Binary Tree to Linked List | Medium |
| 0143 | Reorder List | Medium |
| 0155 | Min Stack | Medium |
| 0173 | Binary Search Tree Iterator | Medium |
Frequently asked questions
- How hard is LeetCode 716. Max Stack?
LeetCode 716. Max Stack is rated Hard on LeetCode.
- What is the time complexity of LeetCode 716. Max Stack?
The Python solution on this page runs in O(n).
- What is the space complexity of LeetCode 716. Max Stack?
The Python solution on this page uses O(n) auxiliary space.
- What topics does LeetCode 716. Max Stack cover?
LeetCode 716. Max Stack is tagged Stack, Design, Linked List, Doubly-Linked List and Ordered Set on LeetCode.
- Is LeetCode 716. Max Stack a premium problem?
Yes. LeetCode 716. Max Stack is a LeetCode Premium problem, so the full statement and test cases require a paid LeetCode subscription.