1
1
""" A Stack using a linked list like structure """
2
2
from __future__ import annotations
3
3
4
- from typing import Any
4
+ from collections .abc import Iterator
5
+ from typing import Generic , Optional , TypeVar
5
6
7
+ T = TypeVar ("T" )
6
8
7
- class Node :
8
- def __init__ (self , data ):
9
+
10
+ class Node (Generic [T ]):
11
+ def __init__ (self , data : T ):
9
12
self .data = data
10
- self .next = None
13
+ self .next : Optional [ Node [ T ]] = None
11
14
12
- def __str__ (self ):
15
+ def __str__ (self ) -> str :
13
16
return f"{ self .data } "
14
17
15
18
16
- class LinkedStack :
19
+ class LinkedStack ( Generic [ T ]) :
17
20
"""
18
21
Linked List Stack implementing push (to top),
19
22
pop (from top) and is_empty
@@ -44,15 +47,15 @@ class LinkedStack:
44
47
"""
45
48
46
49
def __init__ (self ) -> None :
47
- self .top : Node | None = None
50
+ self .top : Optional [ Node [ T ]] = None
48
51
49
- def __iter__ (self ):
52
+ def __iter__ (self ) -> Iterator [ T ] :
50
53
node = self .top
51
54
while node :
52
55
yield node .data
53
56
node = node .next
54
57
55
- def __str__ (self ):
58
+ def __str__ (self ) -> str :
56
59
"""
57
60
>>> stack = LinkedStack()
58
61
>>> stack.push("c")
@@ -63,7 +66,7 @@ def __str__(self):
63
66
"""
64
67
return "->" .join ([str (item ) for item in self ])
65
68
66
- def __len__ (self ):
69
+ def __len__ (self ) -> int :
67
70
"""
68
71
>>> stack = LinkedStack()
69
72
>>> len(stack) == 0
@@ -87,7 +90,7 @@ def is_empty(self) -> bool:
87
90
"""
88
91
return self .top is None
89
92
90
- def push (self , item : Any ) -> None :
93
+ def push (self , item : T ) -> None :
91
94
"""
92
95
>>> stack = LinkedStack()
93
96
>>> stack.push("Python")
@@ -101,7 +104,7 @@ def push(self, item: Any) -> None:
101
104
node .next = self .top
102
105
self .top = node
103
106
104
- def pop (self ) -> Any :
107
+ def pop (self ) -> T :
105
108
"""
106
109
>>> stack = LinkedStack()
107
110
>>> stack.pop()
@@ -125,7 +128,7 @@ def pop(self) -> Any:
125
128
self .top = self .top .next
126
129
return pop_node .data
127
130
128
- def peek (self ) -> Any :
131
+ def peek (self ) -> T :
129
132
"""
130
133
>>> stack = LinkedStack()
131
134
>>> stack.push("Java")
0 commit comments