栈和队列——python

这篇具有很好参考价值的文章主要介绍了栈和队列——python。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、栈

定义一个栈

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

栈的应用——迷宫问题

二、队列

自定义队列

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 None

    def is_empty(self):
        return len(self.stack) == 0

    def 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 False
            elif stack.get_top() == match[ch]:
                stack.pop()
            else:
                return False
    if stack.is_empty():
        return True
    else:
        return False

测试:

栈和队列——python

栈的应用——迷宫问题

# 定义迷宫,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)

栈和队列——python

二、队列

自定义队列

class Queue:
    def __init__(self, size=100):
        self.size = size
        self.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.size
            self.queue[self.rear] = element
        else:
            raise IndexError("Queue is filled.")

    def pop(self):
        if not self.is_empty():
            self.front = (self.front + 1) % self.size
            return 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()  # 队尾出队

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

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

栈和队列——python

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

结果:
栈和队列——python

队列应用——迷宫问题

变量定义:
 

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_path
    min_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 True
        for dir in dirs:
            nextNode = dir(curNode[0], curNode[1])
            # 如果下一个结点为0,表示有路,就把他入队
            if maze[nextNode[0]][nextNode[1]] == 0:
                # queue中要存三个元素,下一个结点的坐标以及其父节点在parent列表中的下标
                # 此时nextNode的父节点就是parent列表的最后一个元素,所以其下标就是len(parent)-1
                queue.append((nextNode[0], nextNode[1], len(parent)-1))
                maze[nextNode[0]][nextNode[1]] = 2   # 标记为已经走过
                # 这里不用break,因为要将所有能走的方向都走完,与深度优先搜索不同
    else:
        print("没有路")
        return False

测试:
栈和队列——python

 文章来源地址https://www.toymoban.com/news/detail-405115.html

到了这里,关于栈和队列——python的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 栈和队列的综合应用-钓鱼

    任务描述 本关任务:给定任意6张牌给甲、乙,设计一个程序判定“纸牌游戏-钓鱼”的胜者。 测试说明 平台会对你编写的代码进行测试: 测试输入: 2 4 1 2 5 6 3 1 3 5 6 4 预期输出: 甲:4,1,2,5,6, 乙:1,3,5,6,4, 栈:2,3, 甲:1,2,5,6, 乙:3,5,6,4, 栈:2,3,4,1, 甲:6,1,1,2,4,3,2, 乙:

    2024年02月07日
    浏览(32)
  • 【数据结构】栈和队列的应用

    🌈积薪高于山,焉用先后别 🌈   🌟 正式开始学习数据结构啦~此专栏作为学习过程中的记录 🌟 对于编译器来说,我们在大多数 I D E IDE I D E 内进行编码时,都会提示括号的匹配标志,可能用不同颜色或者距离差加以区分,那么,编译器中是如何实现这些操作的呢? 其实

    2024年02月10日
    浏览(46)
  • 数据结构上机实验——栈和队列的实现、栈和队列的应用、进制转换、约瑟夫环问题

      1.利用栈的基本操作实现将任意一个十进制整数转化为R进制整数。   2.利用循环队列实现.约瑟夫环问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到k的那个人出圈;他的下一个人又从1开始报数,数到k的那个人出圈;依

    2024年02月08日
    浏览(42)
  • 栈和队列的相关功能实现及其基础应用

           前言:栈和队列是常见的数据结构,它们在计算机科学中被广泛应用。栈和队列都是一些元素的集合,它们的主要区别在于数据的组织方式和访问顺序。在栈中,元素的添加和删除都在同一端进行,称为栈顶,而在队列中,元素的添加和删除分别在两端进行,分别称

    2024年02月05日
    浏览(35)
  • 栈和队列——python

    目录 一、栈 定义一个栈 栈的应用——括号匹配问题 栈的应用——迷宫问题 二、队列 自定义队列 python队列的内置模块 队列应用——打印文件后五行 队列应用——迷宫问题 python的数据结构与算法之栈与队列 自学视频:bilibili路飞学城清华大学博士讲解Python数据结构与算法

    2023年04月08日
    浏览(28)
  • 【无标题】华为OD机试 - 表达式括号匹配(Java & JS & Python & C & C++)

    哈喽,本题库完全免费,收费是为了防止被爬,大家订阅专栏后可以私信联系退款。感谢支持 (1+(2+3)*(3+(8+0))+1-2)这是一个简单的数学表达式,今天不是计算它的值,而是比较它的括号匹配是否正确。 前面这个式子可以简化为(()(()))这样的括号我们认为它是匹配正确的, 而((()

    2024年04月09日
    浏览(86)
  • 青岛大学_王卓老师【数据结构与算法】Week05_01_栈和队列的定义和特点1_学习笔记

    本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享, 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–第05周01–3.1栈和队列的定义和特点

    2024年02月15日
    浏览(40)
  • Java括号匹配

    目录 一、题目描述 二、题解 给定一个只包括  \\\'(\\\' , \\\')\\\' , \\\'{\\\' , \\\'}\\\' , \\\'[\\\' , \\\']\\\'  的字符串  s  ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。 示例: 输

    2024年02月07日
    浏览(37)
  • 解决括号相关匹配问题

    题目 思路 题目中涉及三种类型的括号,可以利用栈 先进后出 的特性,记录当前最近的左括号;当遇到右括号是判断栈顶的左扩号是否是对应的类型,若不能匹配直接返回fasle。若字符串遍历完毕且栈中所有左括号均得到匹配,则返回true. 代码 题目 思路 遍历整个字符串,使

    2024年02月07日
    浏览(32)
  • 【数据结构】用栈实现括号匹配

    1.创立一个判断括号是否匹配的函数BracketsCheck 2.传参(栈,输入的字符串) 3.对字符串中的(、[、{、这三种括号进行匹配 4.顺序从左往右进行,依次将符合条件的括号放入栈中,满足FILO原则 5.但拿到右括号时进行匹配,如果匹配成功,那么就出栈,如果失败就返回false 定义

    2024年02月06日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包