forked from HuipengXu/data-structure-algorithm
/
stack.py
168 lines (135 loc) · 3.6 KB
/
stack.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
from single_linked_list import SingleLinkedList, Node
# 基于 list 实现固定容量的栈
class ListStack:
def __init__(self, capacity):
self.val = []
self.capacity = capacity
# 入栈
def push(self, data):
if len(self.val) >= self.capacity:
return False
self.val.append(data)
return True
# 出栈
def pop(self):
if len(self.val) == 0:
return None
return self.val.pop()
def __len__(self):
return len(self.val)
def __repr__(self):
"""
显示栈的固定容量
"""
return "<ListStack: %d>" % self.capacity
# 基于 list 实现动态扩容的栈
class DynamicListStack:
def __init__(self):
self.val = []
def push(self, data):
self.val.append(data)
return True
def pop(self):
if len(self.val) == 0:
return None
return self.val.pop()
def __len__(self):
return len(self.val)
def __repr__(self):
"""
显示栈的当前大小
"""
return "<DynamicListStack: %d>" % len(self.val)
# 直接调用已经写好的接口
class SingleLinkedStack0:
def __init__(self):
self.items = SingleLinkedList()
self.length = 0
def push(self, item):
self.items.append(item)
self.length += 1
return True
def pop(self):
if len(self.items) == 0:
return None
return self.items.pop(self.length - 1)
def __len__(self):
return len(self.items)
def __repr__(self):
"""
显示栈的容量
"""
return "<SingleLinkedStack0: %d>" % self.length
# 未调用现成的接口,并从链表的尾部插入
class SingleLinkedStack1:
def __init__(self, head=None):
self.head = head
self.length = 0
def push(self, item):
node = self.head
new_node = Node(item)
if not node:
self.head = new_node
self.length += 1
return True
while node:
prev = node
node = node._next
prev._next = new_node
self.length += 1
return True
def pop(self):
if self.length == 0:
return None
node = self.head
if not node._next:
self.head = None
self.length -= 1
return node.val
while node:
prev = node
node = node._next
if not node._next:
break
prev._next = None
self.length -= 1
return node.val
def __len__(self):
return self.length
def __repr__(self):
"""
显示栈的大小
"""
return "<SingleLinkedStack1: %d>" % self.length
# 未调用现成的接口,并从链表的头部插入
class SingleLinkedStack2:
def __init__(self, head=None):
self.head = head
self.length = 0
def push(self, item):
new_node = Node(item)
new_node._next = self.head
self.head = new_node
self.length += 1
return True
def pop(self):
if not self.head:
return None
pop_value = self.head.val
self.head = self.head._next
return pop_value
def __len__(self):
return self.length
def __repr__(self):
"""
显示栈的大小
"""
return "<SingleLinkedStack2: %d>" % self.length
if __name__ == "__main__":
s = SingleLinkedStack2()
for i in range(10):
s.push(i)
print(s.push(12))
print(s.pop())
print(s.pop())
print(s)