LetCode刷题[简单题](2)括号匹配问题(堆栈)

news/2024/7/24 4:54:11 标签: 算法
class Solution {
public:
    bool isValid(string s) {

     std::stack<char> bracketStack;

    for (char ch : s) {
        if (ch == '{' || ch == '[' || ch == '(') {
            bracketStack.push(ch);
        } else if (ch == '}' || ch == ']' || ch == ')') {
            if (bracketStack.empty()) {
                return false;  // 出现了不匹配的右括号
            }
            char openBracket = bracketStack.top();
            if ((ch == '}' && openBracket == '{') ||
                (ch == ']' && openBracket == '[') ||
                (ch == ')' && openBracket == '(')) {
                bracketStack.pop();
            } else {
                return false;  // 括号不匹配
            }
        }
    }

    return bracketStack.empty(); // 如果堆栈为空,所有括号匹配

    }
};

堆栈数据结构的分析

1.  堆栈(Stack)是一种常见的数据结构,通常用于解决与后进先出(Last-In-First-Out,LIFO)有关的问题。它是一种线性数据结构,其中元素按照特定的顺序存储和访问。堆栈的基本操作包括推入(push)元素到堆栈的顶部,弹出(pop)堆栈顶部的元素,以及查看(peek)堆栈顶部的元素,而不实际删除它。

2. 堆栈数据结构的出现确实是计算机科学和编程中的一项重大进步,它为许多问题提供了更为简洁和有效的解决方法。堆栈是一种底层数据结构,具有以下几个方面的重要贡献:

  1. 简化括号匹配和语法分析:在编译器和解释器中,堆栈用于识别和纠正语法错误,以及确保程序代码中的括号、分号和关键字等符号正确匹配和排列。这使得编译器和解释器的实现更容易。

  2. 支持递归:递归是一种强大的编程技术,而堆栈是递归实现的关键。它使函数的递归调用和返回更加可行,允许解决问题的自然分解,而不需要手动管理递归的状态。

  3. 实现函数调用和返回:计算机中的函数调用和返回通常依赖于堆栈来保存函数的局部变量、参数和返回地址。这使得程序执行的控制流管理更加高效。

  4. 历史记录和撤销功能:堆栈用于实现历史记录和撤销功能,如文档编辑器中的撤销操作,使用户能够轻松取消之前的操作。

  5. 支持深度优先搜索:在图和树的遍历算法中,堆栈可用于管理节点的访问顺序,从而使深度优先搜索成为可能。

  6. 简化数据结构操作:堆栈还用于实现其他数据结构,如队列、双端队列和回溯数据结构。这些数据结构是许多算法和应用中的重要组成部分。

总的来说,堆栈数据结构的出现使计算机编程更容易、更高效,并解决了许多需要处理嵌套结构、递归、历史记录和控制流的问题。它是计算机科学中的一个基础性工具,极大地简化了编程任务,提高了编程的效率和可读性。堆栈可以被视为计算机领域的基础数据结构之一,为编程提供了强大的支持。

堆栈为什么能解决现实世界的问题,

  1. 后进先出(LIFO)特性:LIFO特性反映了一些现实世界中的问题,如括号匹配、历史记录、撤销功能等。这些问题通常要求我们首先处理最后发生的事情,然后逐步回溯到更早的事件或状态。堆栈的LIFO特性使其非常适合模拟这种行为。

  2. 递归和函数调用:在现实世界中,许多问题可以通过递归方式进行解决,其中函数调用自身或其他函数。堆栈在跟踪递归函数的状态和参数时非常有用,帮助我们理解和解决问题。

  3. 历史记录和撤销功能:在现实世界中,我们常常需要查看先前的操作或状态,以便撤销错误或回到特定时刻。堆栈用于存储历史记录,以支持撤销和重做操作,这在许多应用程序中非常重要。

  4. 深度优先搜索:在许多现实世界问题中,如路径规划、决策树搜索等,深度优先搜索是一种常用的算法。堆栈用于管理搜索过程中的节点,使其能够回溯到之前的节点。

  5. 嵌套结构:现实世界中存在许多嵌套结构,如文档标记语言中的HTML标签、编程语言中的括号、图中的子图等。堆栈可用于有效地处理这些嵌套结构。

  6. 数学思维的延伸:数学中的许多概念,如函数调用、递归、树和图的遍历,与堆栈数据结构密切相关。堆栈是一种数学思维的实际应用,使我们能够在编程中更好地理解和解决问题。

总的来说,堆栈数据结构的特征与现实世界中许多问题的本质相契合,使其成为解决这些问题的有力工具。堆栈的LIFO特性和与数学思维的联系使其在编程和计算机科学中具有广泛的应用,可以更有效地解决复杂性问题。

举个例子:

1.现实世界中的递归问题,A0的问题解决取决于A1解决的前置条件,A1到A2,A2到A3等等。这是典型的递归问题

2. 迭代问题:迭代是变量状态的变化,相对于递归是不停的推任务,迭代是不停的状态更迭。在思考上有一定的区别。


http://www.niftyadmin.cn/n/5089347.html

相关文章

C++ 之 queue、stack、dueque队列

queue queue队列&#xff0c;特点是先进先出&#xff0c;类似于排队&#xff0c;先排的人先用。它长用于模仿队列&#xff0c;在算法中比较常用的是单调队列算法。 定义结构&#xff1a; queue<数据类型> 变量名 #include <queue>queue<int> q1; queue<…

Zabbix 使用同一ODBC监控不同版本MySQL

一、ODBC介绍 ODBC是Open Database Connect 即开发数据库互连的简称&#xff0c;它是一个用于访问数据库的统一界面标准。ODBC引入一个公共接口以解决不同数据库潜在的不一致性&#xff0c;从而很好的保证了基于数据库系统的应用程序的相对独立性。ODBC 概念由 Microsoft 开发&…

基于Java的二手车交易管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

opencv图形绘制2

目录 制作宣传语&#xff08;中文&#xff09; 制作宣传语&#xff08;英文&#xff09; 绘制标记 鼠标交互绘制十字线 鼠标交互绘制图形 鼠标交互制作几何画板 滚动条控制 鼠标事件练习 制作宣传语&#xff08;中文&#xff09; import cv2 import numpy as np from …

PCB板的元素组成

PCB板是电子工艺一道重要的步骤&#xff0c;市面上几乎所有的电子产品的主板组成都是PCB板。 那正常一块PCB板上有哪些元素呢&#xff1f;正常一般会包括边框&#xff0c;过孔&#xff0c;通孔&#xff0c;铺铜等等。 焊盘&#xff1a; 就是用于焊接元器件&#xff0c;IC等引脚…

PPP的建链过程

下图是PPP协议整个链路过程需经历阶段的状态转移图&#xff1a; 图1 PPP链路建立过程 PPP运行的过程简单描述如下&#xff1a; 通信双方开始建立PPP链路时&#xff0c;先进入到Establish阶段。 在Establish阶段&#xff0c;PPP链路进行LCP协商。协商内容包括工作方式是SP&am…

【c语言】迷宫游戏

之前想写的迷宫游戏今天终于大功告成&#xff0c;解决了随机生成迷宫地图的问题&#xff0c;使用的是深度优先算法递归版本&#xff0c;之前的迷宫找通路问题用的是深度优先算法的非递归实现.之前写过推箱子&#xff0c;推箱子用到了人物的移动&#xff0c;以及碰到墙就不会走&…

基于redisson实现注解式分布式锁

依赖版本 spring-boot-starter 2.6.3redisson <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.17.1</version> </dependency>springboot配置单机版redisson…