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})"