LeetCode | 栈与队列:算法入门到进阶的全解析

栈和队列作为最基础的数据结构,不仅简单直观,还在算法世界中扮演着举足轻重的角色。无论是处理括号匹配问题、滑动窗口、还是实现先进先出的任务调度,栈与队列都是核心工具。

在本篇文章中,我们将以 LeetCode 中的经典题目为例,全面讲解栈与队列的使用场景、解题技巧以及优化方法。不管你是算法新手还是想巩固基础,这篇博客都能帮你快速掌握栈与队列的精髓!

1.理论

1.1.栈(Stack)

1.1.1.基本概念

  • 一种后进先出(LIFO - Last In First Out)的线性数据结构
  • 只允许在一端(栈顶)进行插入和删除操作
  • 就像一摞盘子,只能从顶部放入或取出

1.1.2.基本操作

  • push:将元素压入栈顶
  • pop:移除并返回栈顶元素
  • peek/top:查看栈顶元素但不移除
  • isEmpty:检查栈是否为空
  • size:返回栈中元素个数

1.1.3.常见应用

  • 函数调用栈
  • 表达式求值
  • 括号匹配
  • 浏览器前进/后退功能
  • 撤销操作(Undo)

1.2.队列(Queue)

1.2.1.基本概念

  • 一种先进先出(FIFO - First In First Out)的线性数据结构
  • 在一端(队尾)添加元素,另一端(队首)删除元素
  • 类似排队买票,先到先得

1.2.2.基本操作

  • enqueue:在队尾添加元素
  • dequeue:移除并返回队首元素
  • front:查看队首元素但不移除
  • isEmpty:检查队列是否为空
  • size:返回队列中元素个数

1.2.3.常见应用

  • 打印任务队列
  • 消息队列
  • 广度优先搜索(BFS)
  • 进程调度
  • 资源共享

总结

最优解的核心是利用栈来处理括号的先进后出特性,并通过映射表快速检查括号是否匹配。这种方法既简单又高效,是解决括号匹配类问题的通用模板。

2.真题

【Leetcode 20】有效的括号(Valid Parentheses)

题目描述

给定一个只包括 '(', ')', '{', '}', '[', ']' 的字符串 s,判断字符串是否有效。

有效字符串的条件

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

示例

  • 输入:s = "()",输出:true
  • 输入:s = "()[]{}",输出:true
  • 输入:s = "(]",输出:false

解题思路

  1. 括号匹配的映射关系

    • 创建一个哈希表 mapping,用来存储每种右括号对应的左括号。
    • 如:mapping = {')': '(', '}': '{', ']': '['}
  2. 使用栈

  • 遇到左括号时,将其压入栈中。
  • 遇到右括号时:检查栈顶元素是否与其匹配;如果匹配,弹出栈顶元素;如果不匹配,返回 False

3.遍历结束后检查栈:如果栈为空,说明所有括号都匹配成功;否则,返回 False

class Solution:
    def isValid(self,s:str)->bool:
        stack=[]
        mapping={')':'(',']':'[','}':'{'}

        for char in s:
            if char in mapping:
                top_element=stack.pop() if stack else '#'
                if mapping[char]!=top_element:
                    return False

            else:
                stack.append(char)

        return not stack 
    
# top_element=stack.pop() if stack else '#'合并了检查栈是否为空和获取栈顶元素两个操作
## 如果栈为空,设置一个特殊字符 '#' 作为默认值
##  如果栈不为空,直接弹出栈顶元素

复杂度分析

时间复杂度:每个字符最多入栈或出栈一次;总时间复杂度为 O(n),其中 n 是字符串的长度。

空间复杂度:最坏情况下,栈中需要存储所有左括号。空间复杂度为 O(n)

【Leetcode 155】最小栈(Min Stack)

【Leetcode 394】字符串解码(Decode String)

【Leetcode 84】柱状图中最大的矩形(Largest Rectangle in Histogram)

【Leetcode 739】每日温度(Daily Temperatures)

【Leetcode 85】最大矩形(Maximal Rectangle)

3.疑问与解答【PS】

【PS1】栈和单调栈的区别是什么?

普通栈是一种后进先出的基础数据结构,而单调栈是一种特殊的栈,它在保持栈的基本特性的同时,还需要确保栈内元素保持单调递增或单调递减的顺序。

参考文献

【1】khoury.northeastern.edu/home/vkp/213-sp07/Lectures/AllLectures/lec-mar-29.html

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

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

相关文章

得物App再迎开放日,全流程体验正品查验鉴别

近日,得物App超级品质保障中心再度迎来了开放日活动。近60位得物App的用户与粉丝齐聚超级品质保障中心,全流程体验正品查验鉴别。开放日当天,参与者有机会近距离观察得物App的商品质检区、鉴别区、收发流转区、实验室和正品库等关键功能区&am…

docker 部署 MantisBT

1. docker 安装MantisBT docker pull vimagick/mantisbt:latest 2.先运行实例,复制配置文件 docker run -p 8084:80 --name mantisbt -d vimagick/mantisbt:latest 3. 复制所需要配置文件到本地路径 docker cp mantisbt:/var/www/html/config/config_inc.php.…

【大语言模型】ACL2024论文-38 从信息瓶颈视角有效过滤检索增强生成中的噪声

【大语言模型】ACL2024论文-38 从信息瓶颈视角有效过滤检索增强生成中的噪声 目录 文章目录 【大语言模型】ACL2024论文-38 从信息瓶颈视角有效过滤检索增强生成中的噪声目录后记 《An Information Bottleneck Perspective for Effective Noise Filtering on Retrieval-Augment…

《火焰烟雾检测开源神经网络模型:智能防火的科技护盾》

一、火灾威胁与检测需求 火灾,始终是高悬在人类社会头顶的 “达摩克利斯之剑”,其带来的灾难后果触目惊心。根据国家消防救援局发布的数据,仅在 2024 年上半年,全国就接报火灾达 31.7 万起 ,造成了 1173 人不幸遇难&am…

深入探究Linux树状目录结构

Linux 作为一款广泛使用的开源操作系统,其目录结构采用了树状设计,这种结构清晰、有条理,便于用户和系统进行文件管理与操作。 一、根目录(/) 根目录是整个 Linux 文件系统的起始点,就像一棵大树的根部&…

【C语言4】数组:一维数组、二维数组、变长数组及数组的练习题

文章目录 前言一、数组的概念二、一维数组2.1. 数组的创建和初始化2.2. 数组的类型2.3. 一维数组的下标2.4. 数组元素的打印和输入2.5. 一维数组在内存中的存储2.6. sizeof 计算数组元素个数 三、二维数组3.1. 二维数组的概念3.1. 二维数组的创建与初始化3.2. 二维数组的下标3.…

图论1-问题 C: 算法7-6:图的遍历——广度优先搜索

题目描述 广度优先搜索遍历类似于树的按层次遍历的过程。其过程为:假设从图中的某顶点v出发,在访问了v之后依次访问v的各个未曾被访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先…

【今日分享】人工智能加速发现能源新材料的结构与性能

人工智能与材料国际学术会议(ICAIM)workshop9是由来自宁夏大学材料与新能源学院副院长王海龙教授及马薇副教授、杜鑫老师组成,他们将以“人工智能加速发现新能源新材料的结构与性能”为主题开展研讨工作,欢迎对该主题感兴趣的专家学者携稿加入。 loadin…

Docker拉取hello-world失败超时解决方法(配置多个镜源)

问题图片 解决方案 //创建目录 sudo mkdir -p /etc/docker //写入加速器配置 sudo tee /etc/docker/daemon.json <<-EOF "registry-mirrors": "https://do.nark.eu.org", "https://dc.j8.work", "https://docker.m.daocloud.io"…

[操作系统] 深入理解操作系统的概念及定位

概念 任何计算机系统都包含⼀个基本的程序集合&#xff0c;称为操作系统(OS)。 其核心功能如图片所示&#xff0c;包括&#xff1a; 内核 (Kernel)&#xff1a; 内核是操作系统的核心部分&#xff0c;被认为是狭义上的操作系统&#xff0c;直接与硬件打交道。负责进程管理、内…

某政务行业基于 SeaTunnel 探索数据集成平台的架构实践

分享嘉宾&#xff1a;某政务公司大数据技术经理 孟小鹏 编辑整理&#xff1a;白鲸开源 曾辉 导读&#xff1a;本篇文章将从数据集成的基础概念入手&#xff0c;解析数据割裂给企业带来的挑战&#xff0c;阐述数据集成的重要性&#xff0c;并对常见的集成场景与工具进行阐述&…

c#删除文件和目录到回收站

之前在c上遇到过这个问题&#xff0c;折腾许久才解决了&#xff0c;这次在c#上再次遇到这个问题&#xff0c;不过似乎容易了一些&#xff0c;亲测代码如下&#xff0c;两种删除方式都写在代码中了。 直接上完整代码&#xff1a; using Microsoft.VisualBasic.FileIO; using Sy…

数据合并与数据关联:数据处理中的核心操作

在数据分析和处理过程中&#xff0c;数据合并&#xff08;Data Merging&#xff09;和数据关联&#xff08;Data Association&#xff09;是两个非常重要的操作。它们分别用于整合不同数据集中的信息以及发现数据之间的潜在关系。 数据合并&#xff08;Data Merging&#xff0…

RK3576 Android14 状态栏和导航栏增加显示控制功能

问题背景&#xff1a; 因为RK3576 Android14用户需要手动控制状态栏和导航栏显示隐藏控制&#xff0c;包括对锁屏后下拉状态栏的屏蔽&#xff0c;在设置功能里增加此功能的控制&#xff0c;故参考一些博客完成此功能&#xff0c;以下是具体代码路径的修改内容。 解决方案&…

【初阶数据结构】序列系统重构:顺序表

文章目录 1.线性表2.顺序表2.1 概念及结构2.1.1 静态顺序表2.2.2 动态顺序表 2.2 接口实现2.2.1 顺序表打印2.2.2 顺序表初始化2.2.3 顺序表销毁2.2.4 顺序表容量检查2.2.5 顺序表尾插2.2.6 顺序表头插2.2.7 顺序表尾删2.2.8 顺序表头删2.2.9 顺序表在pos位置插入x2.2.10 顺序表…

Cosmos:英伟达发布世界基础模型,为机器人及自动驾驶开发加速!

1. 简介 在2025年消费电子展&#xff08;CES&#xff09;上&#xff0c;NVIDIA发布了全新的Cosmos平台&#xff0c;旨在加速物理人工智能&#xff08;AI&#xff09;系统的开发&#xff0c;尤其是自主驾驶车辆和机器人。该平台集成了生成式世界基础模型&#xff08;WFM&#x…

Fine Report连接Mysql数据库

点击 号 点击【数据库查询】 定义数据连接 数据库所在服务器的 IP 地址和端口号&#xff1b; 数据库的名称&#xff1b; 数据库的用户名和密码&#xff1b; 点击【测试连接】 编辑SQL语句 点击确定后&#xff0c;就会出现这张表的所有字段 注意&#xff1a; 一个sql语句对应…

国内汽车法规政策标准解读:GB 44495-2024《汽车整车信息安全技术要求》

目录 背景 概述 标准适用范围 汽车信息安全管理体系要求 ​​​​​​​信息安全基本要求 信息安全技术要求 ◆ 外部连接安全要求&#xff1a; ◆通信安全要求&#xff1a; ◆软件升级安全要求&#xff1a; ◆ 数据安全要求&#xff1a; 检查试验方法 同一型式判定…

我的年度总结

这一年的人生起伏&#xff1a;从曙光到低谷再到新的曙光 其实本来没打算做年度总结的&#xff0c;无聊打开了帅帅的视频&#xff0c;结合自己最近经历的&#xff0c;打算简单聊下。因为原本打算做的内容会是一篇比较丧、低能量者的呻吟。 实习生与创业公司的零到一 第一段工…

隧道IP广播与紧急电话系统:提升隧道安全的关键技术

隧道IP广播与紧急电话系统&#xff1a;提升隧道安全的关键技术 随着现代城市交通的迅猛发展&#xff0c;隧道作为重要的交通基础设施&#xff0c;其安全性与应急处理能力显得尤为重要。隧道IP广播与紧急电话系统作为保障隧道安全的关键技术&#xff0c;正发挥着越来越重要的作…