Skip to content

Commit 3752cd1

Browse files
committed
committed from zkp
1 parent f9d166b commit 3752cd1

1 file changed

Lines changed: 127 additions & 0 deletions

File tree

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
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 Stack(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.pop()
111+
112+
def is_empty(self):
113+
return len(self._items) == 0
114+
115+
116+
def test_Stack():
117+
s = Stack()
118+
for i in range(10):
119+
s.push(i)
120+
assert len(s) == 10
121+
assert s.pop() == 9
122+
assert s.pop() == 8
123+
assert len(s) == 8
124+
125+
126+
if __name__ == "__main__":
127+
test_Stack()

0 commit comments

Comments
 (0)