数据结构与算法04-栈和队列

介绍

栈和队列。事实上它们并不是全新的东西,只不过是多加了一些约束条件的数组而已。但正是这些约束条件为它们赋予了巧妙的用法。

栈和队列都是处理临时数据的灵活工具。在操作系统、打印任务、数据遍历等各种需要临时容器才能构造出美妙算法的场景,它们都大有作为。

栈🎰

每次压栈都是把数据加到栈顶(也就是栈的末尾)。如果想把 0 插入到栈底或中间,那是不允许的,因为这就是栈的特性:只能在末尾插入数据。
从栈顶移除数据叫作出栈。这也是栈的限制:只能移除末尾的数据。

压栈和出栈可被形容为 LIFO(last in,first out)后进先出。解释起来就是最后入栈的元素,
会最先出栈。就像无心向学的学生,最迟到校的总是他,最早回家的也是他😹。

在这里插入图片描述

使用场景

  • 用栈去跟踪函数的调用
  • 语法检查
    例如检查一段代码或数学表达式中的括号是否正确配对。下面是一个使用Python实现的简单示例,用于检测一个字符串中的圆括号、方括号和花括号是否匹配:
def is_brackets_matched(expression):
    # 定义一个字典,用于匹配括号
    brackets_map = {')': '(', '}': '{', ']': '['}
    # 初始化一个空栈
    stack = []

    for char in expression:
        # 如果当前字符是右括号
        if char in brackets_map:
            # 获取栈顶的元素,如果栈为空或者栈顶的元素不是对应的左括号,则不匹配
            if not stack or stack.pop() != brackets_map[char]:
                return False
        else:
            # 非右括号的字符直接压入栈中
            stack.append(char)

    # 如果最后栈为空,说明所有括号都已匹配;否则,有未匹配的括号
    return not stack

# 测试
test_cases = ["()", "(]", "{[()]}", "{[(])}", "((()))", "[{()}]"]
for case in test_cases:
    print(f"{case}: {is_brackets_matched(case)}")

队列🚃

你可以将队列想象成是电影院排队。排在最前面的人会最先离队进入影院。套用到队列上,
就是首先加入队列的,将会首先从队列移出。因此计算机科学家都用缩写“FIFO”(first in, first out)
先进先出,来形容它。

使用场景

  • 从打印机的作业设置,到网络应用程序的后台任务,都有队列的存在
    一个简单的队列使用场景是打印任务调度。假设你有一个打印机,多个用户同时提交打印任务,你可以使用队列来管理这些任务,确保它们按照提交的顺序依次打印。以下是一个简单的Python实现:
class Printer:
    def __init__(self):
        self.print_queue = []

    def submit_job(self, job):
        self.print_queue.append(job)
        print(f"任务 {job} 已加入打印队列")

    def print_next(self):
        if self.print_queue:
            next_job = self.print_queue.pop(0)
            print(f"正在打印任务 {next_job}")
        else:
            print("打印队列为空")

# 创建打印机对象
printer = Printer()

# 用户提交打印任务
printer.submit_job("报告1")
printer.submit_job("报告2")
printer.submit_job("报告3")

# 打印下一个任务
printer.print_next()
printer.print_next()
printer.print_next()

# 输出:
# 任务 报告1 已加入打印队列
# 任务 报告2 已加入打印队列
# 任务 报告3 已加入打印队列
# 正在打印任务 报告1
# 正在打印任务 报告2
# 正在打印任务 报告3
  • 队列也是处理异步请求的理想工具——它能保证请求按接收的顺序来执行

总结

掌握了栈和队列,就解锁出了下一个目标:学习基于栈的递归。递归也是其他高级算法的基
础,我们将会在本书余下的部分讲解它们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/673648.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL实验 带函数查询和综合查询

一、实验目的 1.掌握Management Studio的使用。 2.掌握带函数查询和综合查询的使用。 二、实验内容及要求 1.统计年龄大于30岁的学生的人数。 --统计年龄大于30岁的学生的人数。SELECT COUNT(*) AS 人数FROM StudentWHERE (datepart(yea…

Medieval Lowpoly City with Toon Shader

介绍中世纪低地城市,这是一个创造历史场景、城市和环境的杰作,带有中世纪时期的魔力。 该包拥有70多个精心制作的模型,包括模块化选项,并通过着色器进行了增强,捕捉到了乡村建筑和细节道具的精髓。 用精心挑选的色彩和材料,让自己沉浸在历史的魅力中,仿佛漫步在中世纪的…

YOLOv3深入解析与实战:实时目标检测的高效多尺度架构网络

参考: https://arxiv.org/pdf/1804.02767.pdf https://blog.csdn.net/weixin_43334693/article/details/129143961 网上有很多关于yolo的文章,有些东西没讲清楚,基于自己对论文的理解,也做一个按照自己的想法做的理解。 1. 预测…

Rustdesk 自建服务器教程

一、环境 阿里云轻量服务器、debian11 系统 二、服务端搭建 2.1、开放防火墙指定端口 TCP(21115, 21116, 21117, 21118, 21119)UDP(21116) 2.2、安装 rustdesk 服务器文件 在 github 下载页https://github.com/rustdesk/rustdesk-server/releases/,下载 rustde…

大饼在一个比较关键的转折点,等某个东风来。。。。

1、历史数据对比,看多 图上方指标为BTC价格; 下方链上指标为BTC长期持有者成本均价跟BTC短期持有者成本均价之比。 从历史来看,我们正在启动往顶部的路上,不要畏惧。 2、结构为下降趋势,看空 3、长期持有者MVRV&…

几种更新 npm 项目依赖的实用方法

引言 在软件开发的过程中,我们知道依赖管理是其中一个至关重要的环节。npm(Node Package Manager) 是 Node.js 的包管理器,它主要用于 Node.js 项目的依赖管理和包发布。随着项目的不断发展,依赖库的版本更新和升级成…

Windows 2000 Server:安全配置终极指南

"远古技术,仅供娱乐" 💭 前言:Windows 2000 服务器在当时的市场中占据了很大的比例,主要原因包括操作简单和易于管理,但也经常因为安全性问题受到谴责,Windows 2000 的安全性真的那么差吗&#x…

YOLOv9改进策略 | Conv篇 | 利用YOLOv10提出的SCDown魔改YOLOv9进行下采样(附代码 + 结构图 + 添加教程)

一、本文介绍 本文给大家带来的改进机制是利用YOLOv10提出的SCDown魔改YOLOv9进行下采样,其是更高效的下采样。具体而言,其首先利用点卷积调整通道维度,然后利用深度卷积进行空间下采样。这将计算成本减少到和参数数量减少到。同时&#xff…

【人工智能003】图像识别算法模型常见术语简单总结(已更新)

1.熟悉、梳理、总结数据分析实战中的AI图像识别等实战研发知识体系,这块领域很大,需要耗费很多精力,逐步总结、更新到位,,, 2.欢迎点赞、关注、批评、指正,互三走起来,小手动起来&am…

3、flex弹性盒布局(flex:1?、水平垂直居中、三栏布局)

一、flex布局 任何一个容器都可以指定为 Flex 布局。块元素,行内元素即可。 div{ display: flex; } span{ display: inline-flex; } 注意,设为 Flex 布局以后,子元素的float、clear和vertical-align属性将失效。 二、flex属性 父容器…

WordPress子比内容同步插件

1.支持分类替换 将主站同步过来的文章分类进行替换 2.支持本地化文章图片 (使用储存桶可能会导致无法保存图片) 3.支持自定义文章作者(选择多个作者则同步到的文章作者将会随机分配) 4.支持将同步过来的文章自定义文章状态&…

ThinkBook 14 G6+ IMH(21LD)原厂Win11系统oem镜像下载

lenovo联想笔记本电脑原装出厂Windows11系统安装包, 恢复开箱状态自带预装系统,含恢复重置还原功能 链接:https://pan.baidu.com/s/1WIPNagHrC0wqYC3HIcua9A?pwdhzqg 提取码:hzqg 联想原装出厂系统自带所有驱动、出厂主题壁…

基于Win11下的Wireshark的安装和使用

Wireshark的安装和使用 前言一、Wireshark是什么简介 二、下载Wireshark下载过程查看自己电脑配置 三、安装Wireshark安装过程安装组件创建快捷方式winPacpNpcap 打开检验 四、使用Wireshark实施抓包捕获数据包 五、基于Wireshark使用显示过滤器简介使用方法注意ICMP的请求和应…

dibbler-DHCPv6 的开源框架(C++ 实现)2

前置 在 dibbler-DHCPv6 的开源框架(C 实现)1 说了 dibbler 的安装和编译、使用。在这里说一下 server 的源码分析。 一、主函数文件 dibbler/Port-linux/dibbler-server.cpp 代码路径: 二、主要函数解释 1. 加载配置文件和设置 DUID …

【Python Cookbook】S01E12 根据字段将记录分组

目录 问题解决方案讨论 问题 如果有一系列的字典或对象实例,我们想根据某个特定的字段来分组迭代数据。 解决方案 假设有如下字典列表: rows [{address: 5412 N CLARK, date: 07/01/2012},{address: 5148 N CLARK, date: 07/04/2012},{address: 580…

----JAVA 继承----

引言 再java中你能创造出很多的类,但如果这些类中的成员再另一个类中也要使用,那么就要用到继承来实现指定类中成员的使用了 那么也就可以写出这样的代码 再类Cat中使用了类Animal的成员,这里我们称Cat叫子类,Animal叫父类 概念…

上位机图像处理和嵌入式模块部署(f407 mcu中tf卡读写和fatfs挂载)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 很早之前,个人对tf卡并不是很重视,觉得它就是一个存储工具而已。后来在移植v3s芯片的时候,才发现很多的soc其实…

蓝奏管理器iapp源码V3

蓝奏登录注册,简单管理文件夹等都没问题,就是上传接口需要有能力的人抓包进行修复一下(我留了之前还能正常使用的接口,也是蓝奏官方的,所以参照一下就行。),这个应该也不是什么大问题&#xff0…

IDEA 学习之 命令行太长问题

现象 Error running App Command line is too long. In order to reduce its length classpath file can be used. Would you like to enable classpath file mode for all run configurations of your project?解决办法 办法一 .idea\workspace.xml ——> <compone…

【图自动编码器】基础介绍 及 基于PyTorch的图自动编码器实例代码 | MLP应用于节点级别和图级别的任务实例(附实例代码+数据集)

世界以痛吻我,我要报之以歌。——泰戈尔 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客之星人工智能领域TOP4🌟 🏅[4] 阿里云社区特邀专家博主🏅