Source code for titan_pylib.data_structures.stack.stack

 1from typing import TypeVar, Generic, Iterable
 2
 3T = TypeVar("T")
 4
 5
[docs] 6class Stack(Generic[T]): 7 8 # コンセプト:popをしないStack 9 10 def __init__(self, a: Iterable[T] = []): 11 self.data: list[T] = list(a) 12 self.back: int = len(self.data) 13
[docs] 14 def pop(self) -> T: 15 assert self, f"IndexError: pop() from empty {self.__class__.__name__}." 16 self.back -= 1 17 return self.data[self.back]
18
[docs] 19 def append(self, val: T) -> None: 20 if self.back < len(self.data): 21 self.data[self.back] = val 22 else: 23 self.data.append(val) 24 self.back += 1
25
[docs] 26 def top(self) -> T: 27 return self.data[self.back - 1]
28 29 def __getitem__(self, k: int) -> T: 30 if k < 0: 31 k += self.back 32 return self.data[k] 33 34 def __iter__(self): 35 self.__iter = -1 36 return self 37 38 def __next__(self): 39 if self.__iter + 1 >= self.back: 40 raise StopIteration 41 self.__iter += 1 42 return self.data[self.__iter] 43 44 def __len__(self): 45 return self.back 46 47 def __bool__(self): 48 return self.back > 0 49 50 def __str__(self): 51 return "[" + ", ".join(map(str, self)) + "]" 52 53 def __repr__(self): 54 return f"{self.__class__.__name__}({self})"