目录

一、栈

定义一个栈

栈的应用——括号匹配问题

栈的应用——迷宫问题

二、队列

自定义队列

python队列的内置模块

队列应用——打印文件后五行

队列应用——迷宫问题


python的数据结构与算法之栈与队列

自学视频:bilibili路飞学城清华大学博士讲解Python数据结构与算法

一、栈

定义一个栈

class Stack:def __init__(self):self.stack = []def push(self, element):self.stack.append(element)def pop(self):return self.stack.pop()def get_top(self):if len(self.stack) > 0:return self.stack[-1]   # 取栈顶元素即列表最后一个元素else:return Nonedef is_empty(self):return len(self.stack) == 0def stack_all(self):return self.stack

栈的规则:先进后出First in Last out

栈的应用——括号匹配问题

def brace_match(s):match = {'}': "{", "]": "[", ")": "("}stack = Stack()for ch in s:if ch in {"(", "{", "["}:stack.push(ch)else:if stack.is_empty():return Falseelif stack.get_top() == match[ch]:stack.pop()else:return Falseif stack.is_empty():return Trueelse:return False

测试:

栈的应用——迷宫问题

# 定义迷宫,1表示墙,不能走,0表示路,能走
maze = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],[1, 0, 0, 0, 0, 1, 1, 0, 0, 1],[1, 0, 1, 1, 1, 0, 0, 0, 0, 1],[1, 0, 0, 0, 1, 0, 0, 0, 0, 1],[1, 0, 1, 0, 0, 0, 1, 0, 0, 1],[1, 0, 1, 1, 1, 0, 1, 1, 0, 1],[1, 1, 0, 0, 0, 0, 0, 0, 0, 1],[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
]
# 表示4个方向: 上(x-1,y),右(x,y+1),下(x+1,y),左(x,y-1)
dirs = [lambda x, y: (x-1, y),lambda x, y: (x, y+1),lambda x, y: (x+1, y),lambda x, y: (x, y-1),
]
stack = []
# 深度优先搜索思想,一条道走到黑,最后的路径不一定是最短的
def maze_path(x1, y1, x2, y2):""":param x1: 起点纵坐标:param y1: 起点横坐标:param x2: 终点纵坐标:param y2: 终点横坐标:return:"""stack.append((x1, y1))  # 先将起点坐标入栈# 当栈空的时候表示没有通路,无法到达终点,所以只有当栈非空时执行循环while len(stack) > 0:# 栈顶元素就是当前走到的位置curNode = stack[-1]if curNode[0] == x2 and curNode[1] == y2:# 走到终点了for p in stack:print(p)return True# 遍历四个方向看是否能走for dir in dirs:nextNode = dir(curNode[0], curNode[1])# 如果下一个结点能走:if maze[nextNode[0]][nextNode[1]] == 0:stack.append(nextNode)    # 将nextNode入栈maze[nextNode[0]][nextNode[1]] = 2   # 将该点标记为走过break# 如果一个方向都不能走,就回退else:stack.pop()     # 栈顶出栈else:print("没有路")return False

测试:

maze_path(1, 1, 8, 8)

二、队列

自定义队列

class Queue:def __init__(self, size=100):self.size = sizeself.queue = [0 for _ in range(self.size)]self.rear = 0  # 队尾指针self.front = 0  # 队首指针def push(self, element):if not self.is_filled():self.rear = (self.rear+1) % self.sizeself.queue[self.rear] = elementelse:raise IndexError("Queue is filled.")def pop(self):if not self.is_empty():self.front = (self.front + 1) % self.sizereturn self.queue[self.front]else:raise IndexError("Queue in empty.")# 判断队空def is_empty(self):return self.rear == self.front# 判断队满def is_filled(self):return (self.rear + 1) % self.size == self.front# 测试
q = Queue(5)
for i in range(4):q.push(i)
print(q.is_filled())

python队列的内置模块

from collections import deque# 单向队列
q = deque()
q2 = deque([1, 2, 3], 5)   # 第一个参数为初始进队元素,第二个元素设置队列最大长度
# 队满之后再进队时,队首元素会自动出队
# 对尾进队
q.append(1)
# 队首出队
print(q.popleft())# 双向队列
q.appendleft(1)  # 队首进队
q.pop()  # 队尾出队

队列应用——打印文件后五行

创建一个文本文件,随便输入几行

from collections import deque
# 使用队列打印文件后五行
with open('test.txt', 'r') as f:q = deque(f, 5)# print(q)for line in q:print(line, end="")

结果:

队列应用——迷宫问题

变量定义:

from collections import deque# 定义迷宫,1表示墙,不能走,0表示路,能走
maze = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],[1, 0, 0, 0, 0, 1, 1, 0, 0, 1],[1, 0, 1, 1, 1, 0, 0, 0, 0, 1],[1, 0, 0, 0, 1, 0, 0, 0, 0, 1],[1, 0, 1, 0, 0, 0, 1, 0, 0, 1],[1, 0, 1, 1, 1, 0, 1, 1, 0, 1],[1, 1, 0, 0, 0, 0, 0, 0, 0, 1],[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
]
# 表示4个方向: 上(x-1,y),右(x,y+1),下(x+1,y),左(x,y-1)
dirs = [lambda x, y: (x-1, y),lambda x, y: (x, y+1),lambda x, y: (x+1, y),lambda x, y: (x, y-1),
]

封装方法:

# 走出迷宫后打印路径
def print_path(parent):curNode = parent[-1]  # 此时终点就是parent的最后一个元组min_path = []   # 存放最短路径坐标# 当遍历到起点位置时,即curNode[2]==-1,就终止循环while curNode[2] != -1:min_path.append((curNode[0], curNode[1]))# 下一个结点curNode = parent[curNode[2]]min_path.append(curNode[0:2])   # 最后还要将起点放入min_pathmin_path.reverse()   # 将列表反转,变成从起点到终点表示# 打印输出最短路径:for p in min_path:print(p)
# 广度优先搜索思想,找到的路径就是最短路径
def maze_path_queue(x1, y1, x2, y2):queue = deque()# -1代表当前结点的前一个结点(父结点)queue.append((x1, y1, -1))parent = []   # 用来存放出队的父结点while len(queue) > 0:# 先将当前节点出队并暂时用curNode保存curNode = queue.popleft()parent.append(curNode)if curNode[0] == x2 and curNode[1] == y2:# 到达终点,调用自定义的print_path函数回溯找到这条最优路径print_path(parent)return Truefor dir in dirs:nextNode = dir(curNode[0], curNode[1])# 如果下一个结点为0,表示有路,就把他入队if maze[nextNode[0]][nextNode[1]] == 0:# queue中要存三个元素,下一个结点的坐标以及其父节点在parent列表中的下标# 此时nextNode的父节点就是parent列表的最后一个元素,所以其下标就是len(parent)-1queue.append((nextNode[0], nextNode[1], len(parent)-1))maze[nextNode[0]][nextNode[1]] = 2   # 标记为已经走过# 这里不用break,因为要将所有能走的方向都走完,与深度优先搜索不同else:print("没有路")return False

测试:

栈和队列——python相关推荐

  1. 算法总结——栈与队列

    算法总结--栈与队列 一.栈与队列理论基础 用栈实现队列 Python版本 三.用队列实现栈 Python版本 四.有效的括号 Python版本 五.删除字符串中的所有相邻重复项 Python版本 六 ...

  2. 栈和队列在python中的实现

    栈和队列是两种基本的数据结构,同为容器类型,队列是先进先出,栈是先进后出. 栈 栈提供 push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterat ...

  3. python线性表和队列_[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列...

    python数据结构之线性表 python内置了很多高级数据结构,list,dict,tuple,string,set等,在使用的时候十分舒心.但是,如果从一个初学者的角度利用python学习数据结构 ...

  4. python中栈的描述是_数据结构与算法:Python语言描述 栈和队列.ppt

    数据结构与算法:Python语言描述 栈和队列 迷宫问题 迷宫问题的特点: 存在一集可能位置,一些位置相互连通,一步可达 一个位置可能连通若干位置,出现向前探查的多种可能(有分支) 目标是找到一条路径 ...

  5. python 栈和队列_Python实现栈和队列的简单操作方法示例

    本文实例讲述了Python实现栈和队列的简单操作方法.分享给大家供大家参考,具体如下: 先简单的了解一下数据结构里面的栈和堆: 栈和队列是两种基本的数据结构,同为容器类型.两者根本的区别在于: sta ...

  6. python 栈和队列_python 栈和队列的基本实现

    python中的列表结构可以用来实现栈和队列. [栈]: 栈是一种数据结构,具有先入后出的特点,并且栈的所有操作只能在某一端进行,能进行操作的一端的第一个元素称为栈顶,另一端的第一个元素称为栈底 栈的 ...

  7. Python数据结构与算法(二)栈和队列

    本系列总结了python常用的数据结构和算法,以及一些编程实现. 参考书籍:<数据结构与算法 Python语言实现> [美]Michael T.Goodrich, Roberto Tama ...

  8. 【数据结构】栈、队列、堆的python实现

    [数据结构]栈.队列.堆的python实现 一.栈的python实现 1.1.栈的列表实现方法 1.2.用双向队列模拟栈 二.队列的python实现 2.1.队列的列表实现 2.2.使用deque实现 ...

  9. python栈和队列

    入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删. 目录 一.栈和队列的概念 1.栈 2.队列 二.python中的LifoQueue(其实也是所 ...

最新文章

  1. java子类参数传递给父类_java – 为什么调用将父类作为参数的方法调用,而不是将子类作为参数获取的方法?...
  2. rockMongo时区警告的解决
  3. NOIP Mayan游戏
  4. 帮助企业降本增效,提高IT运营效率的六种方法
  5. 提高篇 第五部分 动态规划 第1章 区间类动态规划
  6. 苹果AirPods 2预计将于3月25日发布 3月29日正式开卖
  7. 随想录(工业软件和消费级软件的区别)
  8. 组织架构递归_映射架构和递归管理数据–第1部分
  9. 可视化分析:洞见数据的秘诀
  10. .Net并行编程系列文章导航
  11. Linux命令解释之rpm
  12. easyui源码翻译1.32--LinkButton(按钮)
  13. ASP.NET读取自定义的config文件
  14. Spring-boot-2.1.X源码编译
  15. 负载均衡及其常见实现方式
  16. 漫谈京东(一)——自营手机类商品数据分析
  17. Flask中 jsonify有什么作用?如何使用?
  18. BrowserslistError: Unknown browser query `w`. Maybe you are using old Browserslist or made typo in q
  19. 解决XWPFRun的addPicture方法无法显示图片的问题
  20. 源代码防泄密解决方案

热门文章

  1. STM32学习笔记:读写内部Flash(介绍+附代码)
  2. 关于 ABAP 开发对象的原始语言版本(Original Language)
  3. adb的am start命令启动Activity报Error type 3错误
  4. 神经网络的图像识别技术,语音识别深度神经网络
  5. Macromedia Captivate
  6. Imagenet的std mean值
  7. 饥荒服务器修改mod没反应,为什么饥荒中服务器mod不能用 | 手游网游页游攻略大全...
  8. win10家庭中文版安装Hyper-V
  9. 【R语言】文件及路劲操作
  10. win32 c语言创建线程,【原创】win32线程及线程内核对象