括号匹配算法「建议收藏」

概述​括号匹配在很多字符串处理的场景中时常被用到,诸如各大IDE括号不匹配的错误提示,编译器编译时检查应该成对出现的括号是否符合要求等,在这里我们就直接使用一种比较常规,但效率不差的方法去解决括号匹配的问题就行了。栈方法匹配问题​为了方便描述,对于需要做匹配的两个符号,比如’(‘和’)’,前者可称为左侧符号,后者可称为右侧符号。在做符号匹配时,如果以左侧符号

大家好,又见面了,我是你们的朋友全栈君。

概述

​ 括号匹配在很多字符串处理的场景中时常被用到,诸如各大IDE括号不匹配的错误提示,编译器编译时检查应该成对出现的括号是否符合要求等,在这里我们就直接使用一种比较常规,但效率不差的方法去解决括号匹配的问题就行了。

栈方法匹配问题

​ 为了方便描述,对于需要做匹配的两个符号,比如’(‘和’)’,前者可称为左侧符号,后者可称为右侧符号。在做符号匹配时,如果以左侧符号为标准,左侧符号需要右侧符号来完成匹配,但是由于诸如括号这类的符号可以做嵌套,所以左侧符号之后既能有左侧符号,也能有右侧符号,处理起来很麻烦。以右侧符号为标准就没有这个问题了,每一个右侧符号都需要一个左侧符号来匹配,并且要求该右侧符号之前最近的一个符号必须是相匹配的左侧符号,这样处理起来就方便多了。

​ 利用栈可以很容易地解决这个问题,在遍历字符串时,若当前位置是右侧符号,那它需要一个该位置之前最近的一个符号为左侧符号,否则不匹配。定义一个栈,用以记录遍历到当前位置时,所遇到的左侧符号,处理方式是这样的,每当遇到一个右侧符号时,检查栈是否为空,若此时栈不为空,则对栈进行pop操作表明顶部元素已被匹配,否则为不匹配情况,直接返回false。当整个字符串遍历结束,我们就可以通过判断该栈是否为空来判断整个字符串中的符号是否匹配。具体代码如下:

Code

bool is_match(const string &str)
{
    size_t len = str.length();
    stack<char> s;
    int i;
    for (i = 0; i < len; ++i) {
        if (str[i] == '(') {
            s.push(str[i]);
            continue;
        }
        if (str[i] == ')') {
            if (!s.empty() && s.top() == '(') {
                s.pop();
                continue;
            }
        }
    }

    if (!s.empty()) {
        return false;
    }

    return true;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/129081.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Flowable 快速入门教程:Flowable 入门开发案例,结合流程设计器详细讲解

    Flowable 快速入门教程:Flowable 入门开发案例,结合流程设计器详细讲解Flowable快速入门教程:Flowable入门开发案例,结合流程设计器详细讲解前言流程设计器集成整体流程图项目结构流程部署启动流程流程节点说明第一审核人节点:实际设置审核人配置信息说明第二审核人:参数设置审核人配置信息说明第三审核人:参数分支判断与实际组配置配置信息说明h前言本文以一个简答的Demo为案例,按节点讲解,目的是为了让刚接触流程引擎的人能更快的熟悉流程引擎开发,了解业务…

    2022年5月21日
    40
  • 数据库 schema含义_数据库表的概念

    数据库 schema含义_数据库表的概念数据库中的Schema突然想到数据库中的schema是什么,于是多方搜索有了基本了解,做一个简单记录:在SQL环境下,schema就是数据库对象的集合,所谓的数据库对象也就是常说的表,索引,视图,存储过程等。在schema之上的,就是数据库的实例,也就是通常createdatabases获得的东西。也就是说一个schema可以有多个schema,可以给不同的用户创建不同的schema,并且他们…

    2025年8月14日
    2
  • java 进销存源代码_java swing开发毕业设计-进销存管理系统源代码下载[通俗易懂]

    java 进销存源代码_java swing开发毕业设计-进销存管理系统源代码下载[通俗易懂]项目描述现在看来很烂,见笑了,不过人还是得面对自己的过去,呵呵运行环境jdk7+sqlserver+IntelliJIDEA项目技术(必填)javaswing+jdbc数据库文件(可选)链接:https://pan.baidu.com/s/1Zc3nOIuJap0xyPYdLMSPHQ提取码:1h39依赖包文件(可选)lib目录下…

    2022年5月6日
    52
  • python 字符串 转义_python转义字符怎么用

    python 字符串 转义_python转义字符怎么用问题与背景python的字符串控制,有时候自动转义会带来很多问题,比如文件路径因为转义变得有异常,json字符串塞进json串中之后,自动的对引号加转义斜杠等,整理一下踩的一些坑。参考资料https://www.cnblogs.com/klobohyz/archive/2012/06/04/2535057.htmlpython使用r进行不转义字符串https://www.cnblogs.com/itdyb/p/5046415.htmlPython中的repr()函数解决方案与案例字

    2025年6月12日
    11
  • 使用phpexcel导出到xls文件的时候出现乱码解决

    使用phpexcel导出到xls文件的时候出现乱码解决

    2021年10月31日
    36
  • java map是有序的吗_java中map遍历

    java map是有序的吗_java中map遍历|背景在调用接口A的时候,传给接口A的参数是通过调用接口B返回然后再重新封装的。接口A是需要验签,也就是说传给接口A的所有参数一定要是按照接口B返回的固有顺序。问题出现了!!!接口B返回的字段是数组类型ClassX[],传给接口A的字段是JSON字符串。我将数组ClassX[]遍历,然后把key,value重新传入了一个Map,而这个Map是newHashMap产生的。最后调……

    2022年9月23日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号