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