Skip to content

Commit 779895e

Browse files
committed
committed from zkp
1 parent fe07eab commit 779895e

1 file changed

Lines changed: 99 additions & 0 deletions

File tree

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
class Node(object):
2+
3+
def __init__(self, value=None, next=None):
4+
self.value, self.next = value, next
5+
6+
7+
class LinkedNode(object):
8+
9+
def __init__(self, maxsize=None):
10+
self.maxsize = maxsize
11+
self.root = Node()
12+
self.tailnode = None
13+
self.length = 0
14+
15+
def __len__(self):
16+
return self.length
17+
18+
def append(self, value):
19+
if self.maxsize is not None and self.length >= self.maxsize:
20+
raise Exception('Full')
21+
node = Node(value)
22+
if self.tailnode is None:
23+
self.root.next = node
24+
else:
25+
tailnode = self.tailnode
26+
tailnode.next = node
27+
self.tailnode = node
28+
self.length += 1
29+
30+
def append_left(self, value):
31+
if self.maxsize is not None and self.length >= self.maxsize:
32+
raise Exception('Full')
33+
node = Node(value)
34+
if self.tailnode is None:
35+
self.root.next = node
36+
self.tailnode = node
37+
else:
38+
headnode = self.root.next
39+
self.root.next = node
40+
node.next = headnode
41+
self.length += 1
42+
43+
def __iter__(self):
44+
for node in self._iter_node():
45+
yield node.value
46+
47+
def _iter_node(self):
48+
curnode = self.root.next
49+
while curnode:
50+
yield curnode
51+
curnode = curnode.next
52+
53+
def popleft(self):
54+
if self.tailnode is None:
55+
return
56+
headnode = self.root.next
57+
self.root.next = headnode.next
58+
value = headnode.value
59+
if headnode is self.tailnode:
60+
self.tailnode = None
61+
del headnode
62+
self.length -= 1
63+
return value
64+
65+
66+
class Queue(object):
67+
def __init__(self, maxlen=None):
68+
self._items = LinkedNode()
69+
70+
def push(self, value):
71+
self._items.append(value)
72+
73+
def pop(self):
74+
return self._items.popleft()
75+
76+
def __len__(self):
77+
return len(self._items)
78+
79+
def __iter__(self):
80+
for item in self._items:
81+
yield item
82+
83+
def empty(self):
84+
return len(self._items) == 0
85+
86+
87+
def test():
88+
q = Queue()
89+
for i in range(5):
90+
q.push(i)
91+
assert list(q) == [i for i in range(5)]
92+
assert len(q) == 5
93+
for i in range(5):
94+
assert q.pop() == i
95+
assert len(q) == 0
96+
97+
98+
if __name__ == "__main__":
99+
test()

0 commit comments

Comments
 (0)