def pop(self) -> T: if self.is_empty(): raise IndexError("pop on empty stack") else: item: T = self._stacks.peek().pop() if self._stacks.peek().is_empty(): self._stacks.pop() if self._stacks.is_empty(): self._stacks = Stack(Stack()) return item
def __init__(self, max_stack_size: int, items: List[T] = []) -> None: if max_stack_size < 1: raise ValueError("illegal max_stack_size: {}".format(max_stack_size)) if items == []: items = [] # avoid issues with mutable default args self._max_stack_size = max_stack_size self._stacks: Stack[Stack[T]] = Stack(Stack()) self._remaining_space = max_stack_size for item in items: if self._remaining_space == 0: self._stacks.push(Stack()) self._remaining_space = self._max_stack_size self._stacks.peek().push(item) self._remaining_space -= 1
def push(self, item: T) -> None: if self._remaining_space == 0: self._stacks.push(Stack()) self._remaining_space = self._max_stack_size self._stacks.peek().push(item) self._remaining_space -= 1 return
def test_iter(): ll_iter = Stack(10, 11, 12).__iter__() assert ll_iter.__next__() == 12 assert ll_iter.__next__() == 11 assert ll_iter.__next__() == 10 with pytest.raises(StopIteration): ll_iter.__next__() with pytest.raises(StopIteration): ll_iter.__next__()
def test_sorted_does_not_mutate(): stack = Stack(10, 1, 5, 7) stack.sorted() assert stack == Stack(10, 1, 5, 7)
def test_sorted(): assert Stack(10, 1, 5, 7).sorted() == Stack(1, 5, 7, 10) assert Stack(10, 1, 7, 5, 7).sorted() == Stack(1, 5, 7, 7, 10) assert Stack().sorted() == Stack() assert Stack(5).sorted() == Stack(5) assert Stack(5, 6).sorted() == Stack(5, 6) assert Stack(6, 5).sorted() == Stack(5, 6)
def test_push(): stack = Stack[int]() stack.push(10) stack.push(11) stack.push(12) assert stack == Stack(10, 11, 12)
def test_is_empty(): assert Stack(10, 11, 12).is_empty() is False assert Stack(10).is_empty() is False assert Stack().is_empty() is True
def test_eq(): assert Stack(10, 11, 12, 13) == Stack(10, 11, 12, 13) assert Stack() == Stack() assert Stack() != Stack(10) assert Stack(10, 11, 12, 13) != Stack(10, 11, 12) assert Stack(10, 11, 12, 13) != Stack(11, 12, 13) assert Stack() != [] assert Stack() is not None
def test_len(): assert len(Stack(10, 11, 12, 13)) == 4
def test_to_str(): assert str(Stack()) == "Stack()" assert str(Stack(10)) == "Stack(10)" assert str(Stack(10, 11)) == "Stack(11, 10)"
def test_to_list(): assert list(Stack(10, 11, 12)) == [12, 11, 10]
class SetOfStacks(Generic[T]): def __init__(self, max_stack_size: int, items: List[T] = []) -> None: if max_stack_size < 1: raise ValueError("illegal max_stack_size: {}".format(max_stack_size)) if items == []: items = [] # avoid issues with mutable default args self._max_stack_size = max_stack_size self._stacks: Stack[Stack[T]] = Stack(Stack()) self._remaining_space = max_stack_size for item in items: if self._remaining_space == 0: self._stacks.push(Stack()) self._remaining_space = self._max_stack_size self._stacks.peek().push(item) self._remaining_space -= 1 def pop(self) -> T: if self.is_empty(): raise IndexError("pop on empty stack") else: item: T = self._stacks.peek().pop() if self._stacks.peek().is_empty(): self._stacks.pop() if self._stacks.is_empty(): self._stacks = Stack(Stack()) return item def peek(self) -> T: if self.is_empty() is None: raise IndexError("pop on empty stack") else: return self._stacks.peek().peek() def push(self, item: T) -> None: if self._remaining_space == 0: self._stacks.push(Stack()) self._remaining_space = self._max_stack_size self._stacks.peek().push(item) self._remaining_space -= 1 return def is_empty(self) -> bool: return self._stacks.peek().is_empty() def __str__(self) -> str: items = "" if self.is_empty() else ", [{}]".format(", ".join([str(v) for v in list(self)])) return "SetOfStacks({}{})".format(self._max_stack_size, items) def __len__(self) -> int: out = 0 for _ in self: out += 1 return out def __eq__(self, other: Any) -> bool: return ( other is not None and type(other) is SetOfStacks and self._max_stack_size == other._max_stack_size and list(self) == list(other) ) def __iter__(self) -> SetOfStacksIterator[T]: return SetOfStacksIterator[T](self)