1. # -*- coding: utf-8 -*-
  2.  
  3. from collections import deque
  4.  
  5. class Node(object):
  6.  
  7. def __init__(self, value=None, prev=None, next=None):
  8. self.value, self.prev, self.next = value, prev, next
  9.  
  10. class CircularDoubleLinkedList(object):
  11.  
  12. def __init__(self, maxsize=None):
  13. self.maxsize = maxsize
  14. node = Node()
  15. node.next, node.prev = node, node
  16. self.root = node
  17. self.length = 0
  18.  
  19. def __len__(self):
  20. return self.length
  21.  
  22. def headnode(self):
  23. return self.root.next
  24.  
  25. def tailnode(self):
  26. return self.root.prev
  27.  
  28. def append(self, value):
  29. if self.maxsize is not None and len(self) >= self.maxsize:
  30. raise Exception('LinkedList is Full')
  31. node = Node(value=value)
  32. tailnode = self.tailnode() or self.root
  33.  
  34. tailnode.next = node
  35. node.prev = tailnode
  36. node.next = self.root
  37. self.root.prev = node
  38. self.length += 1
  39.  
  40. def appendleft(self, value):
  41. if self.maxsize is not None and len(self) >= self.maxsize:
  42. raise Exception('LinkedList is Full')
  43. node = Node(value=value)
  44. if self.root.next is self.root: # empty
  45. node.next = self.root
  46. node.prev = self.root
  47. self.root.next = node
  48. self.root.prev = node
  49. else:
  50. node.prev = self.root
  51. headnode = self.root.next
  52. node.next = headnode
  53. headnode.prev = node
  54. self.root.next = node
  55. self.length += 1
  56.  
  57. def remove(self, node):
  58. if node is self.root:
  59. return
  60. else: #
  61. node.prev.next = node.next
  62. node.next.prev = node.prev
  63. self.length -= 1
  64. return node
  65.  
  66. def iter_node(self):
  67. if self.root.next is self.root:
  68. return
  69. curnode = self.root.next
  70. while curnode.next is not self.root:
  71. yield curnode
  72. curnode = curnode.next
  73. yield curnode
  74.  
  75. def __iter__(self):
  76. for node in self.iter_node():
  77. yield node.value
  78.  
  79. def iter_node_reverse(self):
  80. if self.root.prev is self.root:
  81. return
  82. curnode = self.root.prev
  83. while curnode.prev is not self.root:
  84. yield curnode
  85. curnode = curnode.prev
  86. yield curnode
  87.  
  88. class Deque(CircularDoubleLinkedList):
  89. def pop(self):
  90. """删除尾节点"""
  91. if len(self) == 0:
  92. raise Exception('empty')
  93. tailnode = self.tailnode()
  94. value = tailnode.value
  95. self.remove(tailnode)
  96. return value
  97.  
  98. def popleft(self):
  99. if len(self) == 0:
  100. raise Exception('empty')
  101. headnode = self.headnode()
  102. value = headnode.value
  103. self.remove(headnode)
  104. return value
  105.  
  106. def test_deque():
  107. dq = Deque()
  108. dq.append(1)
  109.  
  110. dq.append(2)
  111. assert list(dq) == [1, 2]
  112.  
  113. dq.appendleft(0)
  114. assert list(dq) == [0, 1, 2]
  115.  
  116. dq.pop()
  117. assert list(dq) == [0, 1]
  118.  
  119. dq.popleft()
  120. assert list(dq) == [1]
  121.  
  122. dq.pop()
  123. assert len(dq) == 0
  124.  
  125. class Stack(object):
  126. def __init__(self):
  127. self.deque = Deque()
  128.  
  129. def push(self, value):
  130. self.deque.append(value)
  131.  
  132. def pop(self):
  133. return self.deque.pop()
  134.  
  135. class Stack2(object):
  136.  
  137. def __init__(self):
  138. self._deque = deque()
  139.  
  140. def push(self, value):
  141. return self._deque.append(value)
  142.  
  143. def pop(self):
  144. return self._deque.pop()
  145.  
  146. def empty(self):
  147. return len(self._deque) == 0
  148.  
  149. def test_stack():
  150. s = Stack()
  151. s.push(0)
  152. s.push(1)
  153. s.push(2)
  154.  
  155. assert s.pop() == 2
  156. assert s.pop() == 1
  157. assert s.pop() == 0
  158.  
  159. import pytest # pip install pytest
  160. with pytest.raises(Exception) as excinfo:
  161. s.pop()
  162. assert 'empty' in str(excinfo.value)
  163.  
  164. if __name__ == '__main__':
  165. test_stack()

双端循环列表实现栈(python)的更多相关文章

  1. 22.1.23Manacher算法、双端队列、单调栈

    22.1.23Manacher算法.双端队列.单调栈 1.Manacher算法 1)用途: Manacher算法用于解决类似求某个字符串中最长的回文子串.(回文就是正着读和倒着读一样的结构). 2)算 ...

  2. pta6-15(双端循环队列)

    题目链接:https://pintia.cn/problem-sets/1101307589335527424/problems/1101313244863737856 题意:实现双段队列的队首出队. ...

  3. PAT 甲级 1074 Reversing Linked List (25 分)(链表部分逆置,结合使用双端队列和栈,其实使用vector更简单呐)

    1074 Reversing Linked List (25 分)   Given a constant K and a singly linked list L, you are supposed ...

  4. 双端队列-deque【集vector与list于一身的牺牲内存换功能完善】

    看到双端队列(deque)了,书上是这样说的:除了栈和队列外还有一种限定性数据结构是双端队列:双端队列是限定插入和删除操作在表的两端进行的线性表:尽管双端队列看起来似乎比栈和队列更灵活,但实际上在应用 ...

  5. python 下的数据结构与算法---4:线形数据结构,栈,队列,双端队列,列表

    目录: 前言 1:栈 1.1:栈的实现 1.2:栈的应用: 1.2.1:检验数学表达式的括号匹配 1.2.2:将十进制数转化为任意进制 1.2.3:后置表达式的生成及其计算 2:队列 2.1:队列的实 ...

  6. 用python实现栈/队列/双端队列/链表

    栈是元素的有序集合,添加操作与移除操作都发生在其顶端,先进后出栈操作:创建空栈,增删(顶端),查(顶端元素,元素个数,是否为空)应用:将十进制数转换成任意进制数 class Stack: # 用列表创 ...

  7. 循环双端链表(python)

    # -*- coding: utf-8 -*- class Node(object): __slots__ = ('value', 'prev', 'next') # save memory def ...

  8. 06.队列、python标准库中的双端队列、迷宫问题

    class QueueUnderflow(ValueError): """队列为空""" pass class SQueue: def __ ...

  9. python中使用双端队列解决回文问题

    双端队列:英文名字:deque (全名double-ended queue)是一种具有队列和栈性质的抽象数据类型. 双端队列中的元素可以从两端弹出,插入和删除操作限定在队列的两边进行. 双端队列可以在 ...

随机推荐

  1. 10点睛Spring MVC4.1-全局异常处理

    10.1 全局异常处理 使用@ControllerAdvice注解来实现全局异常处理; 使用@ControllerAdvice的属性缩小处理范围 10.2 演示 演示控制器 package com.w ...

  2. ovs 数据包的处理过程

    Openvswitch的内核模块openvswitch.ko会在网卡上注册一个函数netdev_frame_hook,每当有网络包到达网卡的时候,这个函数就会被调用. static struct sk ...

  3. Centos7.0操作系统加固常见方法

    1. 账号和口令 1.1 禁用或删除无用账号 减少系统无用账号,降低安全风险. 操作步骤 使用命令 userdel <用户名> 删除不必要的账号. 使用命令 passwd -l <用 ...

  4. 高级UI-CardView

    CardView是在Android 5.0推出的新控件,为了兼容之前的版本,将其放在了v7包里面,在现在扁平化设计潮流的驱使下,越来越多的软件使用到了CardView这一控件,那么这篇文章就来看看Ca ...

  5. Actor模型的状态(State)+行为(Behavior)+邮箱(Mailbox)

    状态(State)+行为(Behavior)+邮箱(Mailbox) 基于Actor模型的CQRS.ES解决方案分享 开场白 大家晚上好,我是郑承良,跟大家分享的话题是<基于Actor模型的CQ ...

  6. php面相对象基本概念,基本形式,传值

    面向对象基本概念 面向对象三大特性:封装  继承  多态 类与对象 类:是用于描述“某一些具有共同特征”的物体的概念,是某一类物体的总称. 通常,一个类所具有的共同特征包括2大方面的信息: 外观,形状 ...

  7. Google BERT

    概述 BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder,因为decoder是不 ...

  8. linux中硬盘分区、格式化、挂载

    已经接触了小半年的linux,基本命令用的还行,就是涉及到深入操作,就显得不够看了,比如linux中的硬盘操作,于是整理了这篇博客. 1. 主分区,扩展分区,逻辑分区的联系和区别 ​ 一个硬盘可以有1 ...

  9. conda 创建tensorflow虚拟环境后,无法import tensorflow在jupyter

    ensorflow安装好了,在python中也测试过了,但在jupyter中却会报错,原因是先装的Anaconda 之后装的tensorflow,所以环境有问题,所以需要重装jupyter,先激活te ...

  10. [PDF] - 获取 RadioButtonList 控件值的方法

    背景 目标是通过 iTextSharp 读取 PDF 模板,填充内容后以生成新 PDF 文件.利用 福昕PDF编辑器个人版 可以获取到 RadioButtonList 的组名,但是获取不到每一个 Ra ...