栈是元素的有序集合,添加操作与移除操作都发生在其顶端,先进后出
栈操作:创建空栈,增删(顶端),查(顶端元素,元素个数,是否为空)
应用:将十进制数转换成任意进制数
 class Stack:
# 用列表创建一个空栈
def __init__(self):
self.items = [] # 将一个元素添加到栈的顶端
def push(self, item):
self.item.append(item) # 将栈顶端的元素移除
def pop(self):
return self.items.pop() # 返回栈顶端的元素
def peek(self):
return self.items[len(self.items) - 1] # 返回栈中元素的个数
def size(self):
return len(self.items) # 判断栈是否为空,是返回True,否则返回False
def is_empty(self):
return self.items == []

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

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

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

 应用:回文检测器

class Deque:
def __init__(self):
self.items = [] # 前端加入元素
def add_front(self, item):
self.items.append(item) # 后端加入元素
def add_rear(self, item):
self.items.insert(0, item) def remove_front(self):
return self.items.pop() def remove_rear(self):
return self.items.pop(0) def size(self):
return len(self.items) def is_empty(self):
return self.items == []

无序列表是元素的集合,其中每一个元素都有一个相对于其他元素的位置,无序列表需要维持元素之间的相对位置,但是并不需要在连续的内存空间中维护这些位置信息
无序列表操作:创建一个空列表,增(头部添加,末尾添加,在确定位置添加),删(移除某元素,移除末尾元素,移除指定位置元素),
查(元素个数,搜索某元素,查询是否为空,查询某个元素的下标)
单链表:必须指明第一个元素的位置,最后一个元素需要知道自己没有下一个元素
节点是构建链表的基本数据结构
节点组成:元素(数据变量) + 指向下一个节点的引用(也是一个对象), 尾节点只有元素,引用为None
节点操作:访问(元素,指向下一个节点的引用),修改(元素,指向下一个节点的引用)
class Node:
def __init__(self, init_data):
self.data = init_data
self.next = None class UnorderedList():
def __init__(self):
self.head = None # 头节点,用于存储节点对象 def add(self, item):
"""链表头部添加元素"""
node = Node(item) # 创建一个新节点
node.next = self.head # 将新节点引用从None改为指向待添加列表中的第一个节点
self.head = node # 新创建的节点自动成为新列表的第一个节点,因此将头节点,指向新创建的节点 def append(self, item):
"""链表尾部添加元素"""
node = Node(item)
if self.head is None:
self.head = node
else:
current = self.head # 获得第一个节点对象
while current.next is not None: # 判断节点对象的引用属性是否为None
current = current.next # 获得下一个节点对象,用列表中的列表理解
current.next = node def insert(self, pos, item):
"""指定位置添加元素"""
if pos <= 0:
self.add(item)
elif pos > self.length() - 1:
self.append(item)
else:
current = self.head
count = 0
while count < pos - 1:
count += 1
current = current.next
# 循环退出后,pre指向pos-1的位置
node = Node(item)
node.next = current.next
current.next = node def remove(self, item):
"""删除指定元素"""
current = self.head
previous = None
while True:
if current.data == item:
break
else:
previous = current
current = current.next
if previous is None:
self.head = current.next
else:
previous.next = current.next def pop(self, pos=None):
"""删除指定位置的元素,不传参数则默认删除末尾元素"""
current = self.head
previous = None
if pos is None:
while True:
if current.next is None:
break
else:
previous = current
current = current.next
if previous is None:
self.head = None
else:
previous.next = current.next
elif pos == 0:
self.head = current.next
else:
for i in range(pos):
previous = current
current = current.next
previous.next = current.next
return current.data def length(self):
"""获取链表元素个数,即节点个数"""
current = self.head
count = 0
while current is not None:
count += 1
current = current.next
return count def search(self, item):
"""查询某位元素是否存在"""
current = self.head
while current is not None:
if current.data == item:
return True
else:
current = current.next
return False def is_empty(self):
"""查询链表是否为空"""
return self.head is None def index(self, item):
"""查询某元素的下标"""
pos = 0
current = self.head
while True:
if current.data is item:
break
else:
current = current.next
pos += 1
return pos

有序列表:通常以升序或降序排列
有序列表操作:创建一个空有序列表,增(添加某元素,并保持整个列表顺序),删(移除某元素,移除末尾元素,移除指定位置元素)
查(某元素是否存在,列表是否为空,元素的个数,元素的下标)
class Node:
def __init__(self, init_data):
self.data = init_data
self.next = None class OrderedList():
def __init__(self):
self.head = None # 头节点,用于存储节点对象 def add(self, item):
"""添加某元素,并保持整个列表顺序"""
current = self.head
previous = None
stop = False
while current is not None and not stop:
if current.data > item:
stop = True
else:
previous = current
current = current.next
node = Node(item) # 创建一个新节点
if previous is None:
node.next = self.head
self.head = node
else:
node.next = current
previous.next = node def remove(self, item):
"""删除指定元素"""
current = self.head
previous = None
while True:
if current.data == item:
break
else:
previous = current
current = current.next
if previous is None:
self.head = current.next
else:
previous.next = current.next def pop(self, pos=None):
""" 删除指定位置的元素,不传参数则默认删除末尾元素 """
current = self.head
previous = None
if pos is None:
while True:
if current.next is None:
break
else:
previous = current
current = current.next
if previous is None:
self.head = None
else:
previous.next = current.next
elif pos == 0:
self.head = current.next
else:
for i in range(pos):
previous = current
current = current.next
previous.next = current.next
return current.data def length(self):
"""获取链表元素个数,即节点个数"""
current = self.head
count = 0
while current is not None:
count += 1
current = current.next
return count def search(self, item):
"""查询某位元素是否存在"""
current = self.head
found = False
stop =False
while current is not None and not found and not stop:
if current.data == item:
found = True
else:
if current.data > item:
stop = True
else:
current = current.next
return found def is_empty(self):
"""查询链表是否为空"""
return self.head is None def index(self, item):
"""查询某元素的下标"""
pos = 0
current = self.head
while True:
if current.data is item:
break
else:
current = current.next
pos += 1
return pos

 
 

用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. 【Spring注解驱动开发】使用@Lazy注解实现懒加载

    写在前面 Spring在启动时,默认会将单实例bean进行实例化,并加载到Spring容器中.也就是说,单实例bean默认在Spring容器启动的时候创建对象,并将对象加载到Spring容器中.如果我 ...

  2. kafka基本概念和hello world搭建

    什么是kafka? Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据 ...

  3. Java学习之多线程详解

    一.多线程的实现 1.继承Thread类 ​ a.子类继承Thread类具备多线程能力 ​ b.启动线程:子类对象.start() ​ c.不建议使用:避免OOP单继承局限性 package com. ...

  4. 【MySQL】究竟什么是MVCC呢?

    MVCC是什么呢? MVCC其实就是一个多版本并发控制,即多个不同版本的数据实现并发控制的技术,其基本思想是为每次事务生成一个新版本的数据, 在读数据时选择不同版本的数据即可以实现对事务结果的完整性读 ...

  5. python基础--程序交互、格式化输出、流程控制、break、continue

    在此申明一下,博客参照了https://www.cnblogs.com/jin-xin/,自己做了部分的改动 (1) 程序交互 #!/usr/bin/env python # -*- coding: ...

  6. 解决Mac上打开txt文件乱码问题

    出处:https://www.jianshu.com/p/f55ddf1e9839 经常会在Mac上打开一个txt文件,发现里面的中文都是乱码,问题是在Windows和手机上看都完全是正常的,这就十分 ...

  7. 【JMeter_15】JMeter逻辑控制器__仅一次控制器<Once Only Controller>

    仅一次控制器<Once Only Controller> 业务逻辑: 在每个线程内,该控制器下的内容只会被执行一遍,无论循环多少次,都只执行一遍.<嵌套在循环控制器之内时是个例外,每 ...

  8. WeChair项目Alpha冲刺(2/10)

    团队项目进行情况 1.昨日进展    Alpha冲刺第二天 昨日进展: 前端完成小程序首页的html+css设计 后端springboot项目搭建完成 详情参见github 数据库也初步建成一些表格, ...

  9. Wireshark论证TCP3次握手的过程

    wireshark过滤条件:ip.addr == 120.79.36.180 千万别写成 ip.dst == 120.79.36.180 ,这样子就看不到服务器给我们返回的包了 此时,在浏览器输入12 ...

  10. JavaWeb网上图书商城完整项目--day02-25.查询所有分类功能之流程分析

    分类模块的业务流程入下面所示: