Skip to content

Commit f4ef044

Browse files
committed
add stack
1 parent 2009de1 commit f4ef044

File tree

4 files changed

+151
-164
lines changed

4 files changed

+151
-164
lines changed

docs/03_链表/double_link_list.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,14 @@ def appendleft(self, value):
4545
raise Exception('LinkedList is Full')
4646
node = Node(value=value)
4747
if self.root.next is self.root: # empty
48-
node.next = self.root
4948
node.prev = self.root
49+
node.next = self.root
5050
self.root.next = node
5151
self.root.prev = node
5252
else:
53-
node.prev = self.root
5453
headnode = self.root.next
54+
55+
node.prev = self.root
5556
node.next = headnode
5657
headnode.prev = node
5758
self.root.next = node

ehco/link_list/lru.py

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
from collections import OrderedDict
2+
3+
14
class Node:
25
def __init__(self, value=None, next=None, prev=None):
36
self.value = value
@@ -32,13 +35,15 @@ def append(self, value):
3235

3336
self.tail.next = node
3437
node.prev = self.tail
38+
node.next = self.root
3539
self.root.prev = node
3640
self.lens += 1
3741

3842
def append_left(self, value):
3943
node = Node(value)
4044

4145
node.next = self.head
46+
self.head.prev = node
4247
self.root.next = node
4348
node.prev = self.root
4449
self.lens += 1
@@ -58,7 +63,7 @@ def remove(self, node):
5863

5964
def iter_item(self):
6065
cur = self.root.next
61-
while cur:
66+
while cur and cur != self.root:
6267
yield cur
6368
cur = cur.next
6469

@@ -114,55 +119,68 @@ def _append(self, k, v):
114119
# Bind cache key
115120
self._link.tail.cache_key = k
116121

117-
def _expired(self):
122+
def _expired_not_used(self):
118123
need_expired = self._link.head
119124
self._link.remove(need_expired)
120-
del self._cache[need_expired.cache_key]
121-
122-
@property
123-
def now_count(self):
124-
return self._link.lens
125125

126126
def get(self, k):
127-
node = self._cache.get(k, None)
127+
node = self._cache.pop(k, None)
128128
if not node:
129129
return
130130
self._move_to_recent(node)
131131
return node.value
132132

133-
def set(self, k, v):
134-
if k in self._cache:
135-
node = self._cache[k]
133+
def put(self, k, v):
134+
node = self._cache.pop(k, None)
135+
if node:
136136
node.value = v
137137
self._move_to_recent(node)
138138
else:
139-
if self.now_count == self.size:
140-
self._expired()
139+
if self._link.lens == self.size:
140+
self._expired_not_used()
141141
self._append(k, v)
142-
return True
143142

144143
def __str__(self):
145144
return "->".join([f"{node.cache_key}" for node in self._link.iter_item()])
146145

147146
__repr__ = __str__
148147

149148

149+
class OLRU:
150+
def __init__(self, size=10):
151+
self._cache = OrderedDict()
152+
self.size = size
153+
154+
def get(self, k):
155+
ret = self._cache.pop(k, None)
156+
if ret:
157+
self._cache[k] = ret
158+
return ret
159+
160+
def put(self, k, v):
161+
ret = self._cache.pop(k, None)
162+
if not ret and len(self._cache) == self.size:
163+
# NOTE pop last recent used item
164+
self._cache.popitem(False)
165+
self._cache[k] = v
166+
167+
150168
def test_lru():
151169
lru = LRU(size=10)
152170

153171
for i in range(10):
154-
lru.set(i, i)
172+
lru.put(i, i)
155173

156174
for i in range(10):
157175
assert lru.get(i) == i
158176

159177
print(lru)
160-
lru.set(11, 11)
178+
lru.put(11, 11)
161179
assert lru.get(11) == 11
162180
print(lru)
163181

164182
assert lru.get(0) == None
165183

166184
for i in range(100):
167-
lru.set(i, i)
185+
lru.put(i, i)
168186
print(lru)

ehco/queue/dubble_ended_queue.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
from ehco.link_list.lru import DBL
2+
3+
4+
class Dequeue:
5+
def __init__(self):
6+
self._double_link_list = DBL()
7+
8+
@property
9+
def head(self):
10+
return self._double_link_list.head
11+
12+
@property
13+
def tail(self):
14+
return self._double_link_list.tail
15+
16+
def append(self, val):
17+
self._double_link_list.append(val)
18+
19+
def append_left(self, val):
20+
self._double_link_list.append_left(val)
21+
22+
def pop(self):
23+
node = self.tail
24+
res = self._double_link_list.remove(node)
25+
if res:
26+
return node.value
27+
28+
def pop_left(self):
29+
node = self.head
30+
res = self._double_link_list.remove(node)
31+
if res:
32+
return node.value
33+
34+
35+
def test_double_ended_queue():
36+
deq = Dequeue()
37+
38+
for i in range(10):
39+
deq.append(i)
40+
41+
for i in range(10):
42+
assert deq.pop_left() == i
43+
44+
for i in range(10):
45+
deq.append_left(i)
46+
47+
for i in range(10):
48+
assert deq.pop() == i
49+

0 commit comments

Comments
 (0)