# -*- coding: utf-8 -*-

from collections import deque

class Node(object):

    def __init__(self, value=None, prev=None, next=None):
self.value, self.prev, self.next = value, prev, next class CircularDoubleLinkedList(object): def __init__(self, maxsize=None):
self.maxsize = maxsize
node = Node()
node.next, node.prev = node, node
self.root = node
self.length = 0 def __len__(self):
return self.length def headnode(self):
return self.root.next def tailnode(self):
return self.root.prev def append(self, value):
if self.maxsize is not None and len(self) >= self.maxsize:
raise Exception('LinkedList is Full')
node = Node(value=value)
tailnode = self.tailnode() or self.root tailnode.next = node
node.prev = tailnode
node.next = self.root
self.root.prev = node
self.length += 1 def appendleft(self, value):
if self.maxsize is not None and len(self) >= self.maxsize:
raise Exception('LinkedList is Full')
node = Node(value=value)
if self.root.next is self.root: # empty
node.next = self.root
node.prev = self.root
self.root.next = node
self.root.prev = node
else:
node.prev = self.root
headnode = self.root.next
node.next = headnode
headnode.prev = node
self.root.next = node
self.length += 1 def remove(self, node):
if node is self.root:
return
else: #
node.prev.next = node.next
node.next.prev = node.prev
self.length -= 1
return node def iter_node(self):
if self.root.next is self.root:
return
curnode = self.root.next
while curnode.next is not self.root:
yield curnode
curnode = curnode.next
yield curnode def __iter__(self):
for node in self.iter_node():
yield node.value def iter_node_reverse(self):
if self.root.prev is self.root:
return
curnode = self.root.prev
while curnode.prev is not self.root:
yield curnode
curnode = curnode.prev
yield curnode class Deque(CircularDoubleLinkedList):
def pop(self):
"""删除尾节点"""
if len(self) == 0:
raise Exception('empty')
tailnode = self.tailnode()
value = tailnode.value
self.remove(tailnode)
return value def popleft(self):
if len(self) == 0:
raise Exception('empty')
headnode = self.headnode()
value = headnode.value
self.remove(headnode)
return value def test_deque():
dq = Deque()
dq.append(1) dq.append(2)
assert list(dq) == [1, 2] dq.appendleft(0)
assert list(dq) == [0, 1, 2] dq.pop()
assert list(dq) == [0, 1] dq.popleft()
assert list(dq) == [1] dq.pop()
assert len(dq) == 0 class Stack(object):
def __init__(self):
self.deque = Deque() def push(self, value):
self.deque.append(value) def pop(self):
return self.deque.pop() class Stack2(object): def __init__(self):
self._deque = deque() def push(self, value):
return self._deque.append(value) def pop(self):
return self._deque.pop() def empty(self):
return len(self._deque) == 0 def test_stack():
s = Stack()
s.push(0)
s.push(1)
s.push(2) assert s.pop() == 2
assert s.pop() == 1
assert s.pop() == 0 import pytest # pip install pytest
with pytest.raises(Exception) as excinfo:
s.pop()
assert 'empty' in str(excinfo.value) if __name__ == '__main__':
test_stack()

最新文章

  1. 安装KB3132372补丁后,WIN10中IE内核加载flash崩溃
  2. 修改tomcat服务器banner的方法
  3. BZOJ1068: [SCOI2007]压缩
  4. Spark ML 文本的分类
  5. 2014 Asia AnShan Regional Contest --- HDU 5073 Galaxy
  6. error: 'LOGE' was not declared in this scope
  7. hdu1521:排列组合---指数型母函数
  8. 关于Coursera上的斯坦福机器学习课程的编程作业提交问题
  9. rsync源目录写法的一点小细节
  10. 学习pthreads,管理线程的栈
  11. openlayers二:添加矢量图形文字
  12. Docker记录-Docker部署记录
  13. BAT大厂面试流程剖析
  14. JAVA实现SFTP实例
  15. CSS day49
  16. 关于HTTP Message
  17. python运行显示编码错误
  18. Codeforces 385C - Bear and Prime Numbers(素数筛+前缀和+hashing)
  19. 一篇文章让你入门Shell !
  20. 26QTimer定时器的使用

热门文章

  1. Tools - 在线编译环境和工具汇总
  2. pickle.load EOFError: Ran out of input
  3. Django:将后台返回的数据填充到select下拉框中
  4. hadoop(四)MapReduce
  5. VS混淆/反编译/远程调试/Spy++的Tools工具
  6. Java注解-注解处理器、servlet3.0|乐字节
  7. IDEA 的操作与使用
  8. java当中JDBC当中请给出一个sql server的helloworld例子
  9. (7)Spring Boot web开发 --- servlet容器
  10. C++ 用 new 生成一个动态二维数组