Skip to content

Commit f9d166b

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

File tree

1 file changed

+128
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)