1. 栈是元素的有序集合,添加操作与移除操作都发生在其顶端,先进后出
    栈操作:创建空栈,增删(顶端),查(顶端元素,元素个数,是否为空)
    应用:将十进制数转换成任意进制数
  1. class Stack:
  2. # 用列表创建一个空栈
  3. def __init__(self):
  4. self.items = []
  5.  
  6. # 将一个元素添加到栈的顶端
  7. def push(self, item):
  8. self.item.append(item)
  9.  
  10. # 将栈顶端的元素移除
  11. def pop(self):
  12. return self.items.pop()
  13.  
  14. # 返回栈顶端的元素
  15. def peek(self):
  16. return self.items[len(self.items) - 1]
  17.  
  18. # 返回栈中元素的个数
  19. def size(self):
  20. return len(self.items)
  21.  
  22. # 判断栈是否为空,是返回True,否则返回False
  23. def is_empty(self):
  24. return self.items == []

  1. 队列是元素的有序集合,添加操作发生在其尾部,移除操作发生在头部,先进先出
    队列操作:创建空队列,增(底端),删(顶端),查(元素个数, 是否为空,)
    应用:模拟打印任务,知晓打印机的打印速度,打印任务个数随机产生-> 学生平均需要等待多久才能拿到打印好的文章
  1. class Queue:
  2. def __init__(self):
  3. self.items = []
  4. # 在队列底端插入元素
  5. def enqueue(self, item):
  6. self.items.insert(0, item)
  7.  
  8. # 在队列顶端删除元素
  9. def dequeue(self):
  10. return self.items.pop()
  11.  
  12. def size(self):
  13. return len(self.items)
  14.  
  15. def isEmpty(self):
  16. return self.items == []

 双端队列是元素的有序集合,其任何一端都允许添加和移除元素

 双端队列操作:创建一个空双端队列,增(前,后),删(前,后),查(元素个数,是否为空)

 应用:回文检测器

  1. class Deque:
  2. def __init__(self):
  3. self.items = []
  4.  
  5. # 前端加入元素
  6. def add_front(self, item):
  7. self.items.append(item)
  8.  
  9. # 后端加入元素
  10. def add_rear(self, item):
  11. self.items.insert(0, item)
  12.  
  13. def remove_front(self):
  14. return self.items.pop()
  15.  
  16. def remove_rear(self):
  17. return self.items.pop(0)
  18.  
  19. def size(self):
  20. return len(self.items)
  21.  
  22. def is_empty(self):
  23. return self.items == []

  1. 无序列表是元素的集合,其中每一个元素都有一个相对于其他元素的位置,无序列表需要维持元素之间的相对位置,但是并不需要在连续的内存空间中维护这些位置信息
    无序列表操作:创建一个空列表,增(头部添加,末尾添加,在确定位置添加),删(移除某元素,移除末尾元素,移除指定位置元素),
    查(元素个数,搜索某元素,查询是否为空,查询某个元素的下标)
    单链表:必须指明第一个元素的位置,最后一个元素需要知道自己没有下一个元素
    节点是构建链表的基本数据结构
    节点组成:元素(数据变量) + 指向下一个节点的引用(也是一个对象), 尾节点只有元素,引用为None
    节点操作:访问(元素,指向下一个节点的引用),修改(元素,指向下一个节点的引用)
  1. class Node:
  2. def __init__(self, init_data):
  3. self.data = init_data
  4. self.next = None
  5.  
  6. class UnorderedList():
  7. def __init__(self):
  8. self.head = None # 头节点,用于存储节点对象
  9.  
  10. def add(self, item):
  11. """链表头部添加元素"""
  12. node = Node(item) # 创建一个新节点
  13. node.next = self.head # 将新节点引用从None改为指向待添加列表中的第一个节点
  14. self.head = node # 新创建的节点自动成为新列表的第一个节点,因此将头节点,指向新创建的节点
  15.  
  16. def append(self, item):
  17. """链表尾部添加元素"""
  18. node = Node(item)
  19. if self.head is None:
  20. self.head = node
  21. else:
  22. current = self.head # 获得第一个节点对象
  23. while current.next is not None: # 判断节点对象的引用属性是否为None
  24. current = current.next # 获得下一个节点对象,用列表中的列表理解
  25. current.next = node
  26.  
  27. def insert(self, pos, item):
  28. """指定位置添加元素"""
  29. if pos <= 0:
  30. self.add(item)
  31. elif pos > self.length() - 1:
  32. self.append(item)
  33. else:
  34. current = self.head
  35. count = 0
  36. while count < pos - 1:
  37. count += 1
  38. current = current.next
  39. # 循环退出后,pre指向pos-1的位置
  40. node = Node(item)
  41. node.next = current.next
  42. current.next = node
  43.  
  44. def remove(self, item):
  45. """删除指定元素"""
  46. current = self.head
  47. previous = None
  48. while True:
  49. if current.data == item:
  50. break
  51. else:
  52. previous = current
  53. current = current.next
  54. if previous is None:
  55. self.head = current.next
  56. else:
  57. previous.next = current.next
  58.  
  59. def pop(self, pos=None):
  60. """删除指定位置的元素,不传参数则默认删除末尾元素"""
  61. current = self.head
  62. previous = None
  63. if pos is None:
  64. while True:
  65. if current.next is None:
  66. break
  67. else:
  68. previous = current
  69. current = current.next
  70. if previous is None:
  71. self.head = None
  72. else:
  73. previous.next = current.next
  74. elif pos == 0:
  75. self.head = current.next
  76. else:
  77. for i in range(pos):
  78. previous = current
  79. current = current.next
  80. previous.next = current.next
  81. return current.data
  82.  
  83. def length(self):
  84. """获取链表元素个数,即节点个数"""
  85. current = self.head
  86. count = 0
  87. while current is not None:
  88. count += 1
  89. current = current.next
  90. return count
  91.  
  92. def search(self, item):
  93. """查询某位元素是否存在"""
  94. current = self.head
  95. while current is not None:
  96. if current.data == item:
  97. return True
  98. else:
  99. current = current.next
  100. return False
  101.  
  102. def is_empty(self):
  103. """查询链表是否为空"""
  104. return self.head is None
  105.  
  106. def index(self, item):
  107. """查询某元素的下标"""
  108. pos = 0
  109. current = self.head
  110. while True:
  111. if current.data is item:
  112. break
  113. else:
  114. current = current.next
  115. pos += 1
  116. return pos

  1. 有序列表:通常以升序或降序排列
    有序列表操作:创建一个空有序列表,增(添加某元素,并保持整个列表顺序),删(移除某元素,移除末尾元素,移除指定位置元素)
    查(某元素是否存在,列表是否为空,元素的个数,元素的下标)
  1. class Node:
  2. def __init__(self, init_data):
  3. self.data = init_data
  4. self.next = None
  5.  
  6. class OrderedList():
  7. def __init__(self):
  8. self.head = None # 头节点,用于存储节点对象
  9.  
  10. def add(self, item):
  11. """添加某元素,并保持整个列表顺序"""
  12. current = self.head
  13. previous = None
  14. stop = False
  15. while current is not None and not stop:
  16. if current.data > item:
  17. stop = True
  18. else:
  19. previous = current
  20. current = current.next
  21. node = Node(item) # 创建一个新节点
  22. if previous is None:
  23. node.next = self.head
  24. self.head = node
  25. else:
  26. node.next = current
  27. previous.next = node
  28.  
  29. def remove(self, item):
  30. """删除指定元素"""
  31. current = self.head
  32. previous = None
  33. while True:
  34. if current.data == item:
  35. break
  36. else:
  37. previous = current
  38. current = current.next
  39. if previous is None:
  40. self.head = current.next
  41. else:
  42. previous.next = current.next
  43.  
  44. def pop(self, pos=None):
  45. """ 删除指定位置的元素,不传参数则默认删除末尾元素 """
  46. current = self.head
  47. previous = None
  48. if pos is None:
  49. while True:
  50. if current.next is None:
  51. break
  52. else:
  53. previous = current
  54. current = current.next
  55. if previous is None:
  56. self.head = None
  57. else:
  58. previous.next = current.next
  59. elif pos == 0:
  60. self.head = current.next
  61. else:
  62. for i in range(pos):
  63. previous = current
  64. current = current.next
  65. previous.next = current.next
  66. return current.data
  67.  
  68. def length(self):
  69. """获取链表元素个数,即节点个数"""
  70. current = self.head
  71. count = 0
  72. while current is not None:
  73. count += 1
  74. current = current.next
  75. return count
  76.  
  77. def search(self, item):
  78. """查询某位元素是否存在"""
  79. current = self.head
  80. found = False
  81. stop =False
  82. while current is not None and not found and not stop:
  83. if current.data == item:
  84. found = True
  85. else:
  86. if current.data > item:
  87. stop = True
  88. else:
  89. current = current.next
  90. return found
  91.  
  92. def is_empty(self):
  93. """查询链表是否为空"""
  94. return self.head is None
  95.  
  96. def index(self, item):
  97. """查询某元素的下标"""
  98. pos = 0
  99. current = self.head
  100. while True:
  101. if current.data is item:
  102. break
  103. else:
  104. current = current.next
  105. pos += 1
  106. return pos
  1.  
  1.  
  1.  

用python实现栈/队列/双端队列/链表的更多相关文章

  1. 《算法实战策略》-chaper19-队列、栈和双端队列

    对于计算机专业的学生来说,他们一定会很熟悉一句话:程序设计 = 算法 + 数据结构.而根据笔者的理解,所谓程序设计其实就是为了编程解决实际问题,所谓算法是一种解决问题某种思维的方法,但是思维需要得到编 ...

  2. HDU-6375-度度熊学队列-双端队列deque/list

    度度熊正在学习双端队列,他对其翻转和合并产生了很大的兴趣. 初始时有 NN 个空的双端队列(编号为 11 到 NN ),你要支持度度熊的 QQ 次操作. ①11 uu ww valval 在编号为 u ...

  3. 计蒜客 A2232.程序设计:蒜厂年会-单调队列(双端队列(STL deque)实现)滑窗维护最小前缀和

    程序设计:蒜厂年会 问答问题反馈 只看题面 16.79% 1000ms 262144K   在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币. ...

  4. python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/36201499 标准库:一些最爱 集合.堆和双端队 ...

  5. PHP双向队列,双端队列代码

    <?php /**  * User: jifei  * Date: 2013-07-30  * Time: 23:12 */ /**  * PHP实现双向队列,双端队列  * 双端队列(dequ ...

  6. C++泛化双端队列

    循环双端队列 双端队列可以在队首和队尾进行入队操作.出队操作的特殊队列. 循环双端队列是充分利用空间,使用格外的数据存储队头和队尾,这里利用数组进行实现. 循环双端队列(CircleQueue.h) ...

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

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

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

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

  9. 用Python实现的数据结构与算法:双端队列

    一.概述 双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的线性数据结构.双端队列也拥有两端:队首(front).队尾(rear),但与队列不同的是,插入操作在两 ...

随机推荐

  1. 【Java Spring Cloud 实战之路】添加一个SpringBootAdmin监控

    0. 前言 在之前的几章中,我们先搭建了一个项目骨架,又搭建了一个使用nacos的gateway网关项目,网关项目中并没有配置太多的东西.现在我们就接着搭建在Spring Cloud 微服务中另一个重 ...

  2. 【C#】AutoMapper 使用手册

    目录 1 入门例子 2 注册 2.1 Profile 3 配置 3.1 命名约定 3.2 配置可见性 3.3 全局属性/字段过滤 3.4 识别前缀和后缀 3.5 替换字符 4 调用构造函数 5 数组和 ...

  3. Redis学习笔记(二十) 发布订阅(下)

    当一个客户端执行SUBSCRIBE命令订阅某个或某些频道时,这个客户端与被订阅频道之间就建立起了一种订阅关系. Redis将所有频道的订阅关系保存在服务器状态的pubsub_channels字典里面, ...

  4. Fibonacci(模板)【矩阵快速幂】

    Fibonacci 题目链接(点击) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20989   Accepted: 14 ...

  5. Linux中GitLab的部署

    1.版本控制介绍 ​ 版本控制最主要的功能就是追踪文件的变更.它将什么时候.什么人更改了文件的什么内容等信息忠实地了记录下来.每一次文件的改变,文件的版本号都将增加.除了记录版本变更外,版本控制的另一 ...

  6. Excel只想显示一部分日期,怎样把其余部分隐藏起来?

      问题:只想显示一部分日期,怎样把其余部分隐藏起来? 方法:分列 Step1:选中需要修改的单元格——数据——分列. Step2:固定宽度——点击下一步. Step3:在建立分列处单击鼠标(若想取消 ...

  7. (十一)Maven运行TestNG的testcase 两种方式:testng.xml和testngCase.java

    原文:https://blog.csdn.net/wwhrestarting/article/details/46596869?utm_source=copy 1.通过maven-surefire-p ...

  8. Linux下自己和自己用各种方法进行文件的上传下载

    环境: Ubuntu 16.04 1.SCP # 上传 scp /home/sea/Desktop/test.sh sea@192.168.1.31:/home/sea/Desktop/test.sh ...

  9. ca75a_c++_标准IO库-利用流对象把文件内容读取到向量-操作文件

    /*ca75a_c++_标准IO库习题练习习题8.3,8.4,8.6习题8.9.8.10 ifstream inFile(fileName.c_str());1>d:\users\txwtech ...

  10. CRC16冗余循环检测计算器-好用。modbus RTU

    开始使用 http://cht.nahua.com.tw/index.php?url=http://cht.nahua.com.tw/software/crc16/&key=Modbus,%2 ...