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

括号匹配问题:给一个字符串,其中包括小括号、中括号、大括号.求该字符串中的括号是否匹配?

例如:

()()[]{}      --> 匹配

([{()}])      --> 匹配

[]{            --> 不匹配

[(]]          --> 不匹配

这里可以借助栈的思想来做:

1.遍历字符串:从左边开始,如果是字符是左括号“(”、“[”、“{”,则进行进栈操作

2.如果字符是右括号“)”、“]”、“}”

         2.1.先判断栈是否为空? 为空,则不匹配;不为空,则进行2.2.

         2.2.取出栈顶,看看栈顶的字符是否与右括号匹配,如果匹配,则移除栈顶,如果不匹配,则结果不匹配.

 (PS:注意,右括号仅用来做判断,不会进行进栈出栈操作)

      2.3.如果都不符合2.1、2.2 的情况,则不匹配

3.最后判断栈是否为空,为空则说明匹配,不为空则说明不匹配

算法解答:

这里用数组(NSMutableArray)代替栈(Stack),便于理解,原理请看我上一篇文章:CSDN

判断的代码如下:

- (BOOL)brace_match:(NSString *)str
{NSMutableArray * resultArray = [NSMutableArray array];NSDictionary * dic = @{@"}":@"{",@"]":@"[",@")":@"("};//将字符串分割成单个字符并转为数组(可以看我上一篇文章的描述)NSMutableArray * strArray = [self separateString:str];for (NSString * ch in strArray){if ([ch isEqualToString:@"{"] || [ch isEqualToString:@"["] || [ch isEqualToString:@"("]){[resultArray addObject:ch];}else{if (resultArray.count == 0){return false;}else if ([[resultArray lastObject] isEqualToString:[dic objectForKey:ch]]){[resultArray removeObject:[resultArray lastObject]];}else{return false;}}}if (resultArray.count == 0){return YES;}else{return false;}
}

将字符串分割成单个字符并转为数组 代码:

(可以看我上一篇文章的描述:CSDN)

#pragma mark 将字符串分割成单个字符
- (NSMutableArray *)separateString:(NSString *)str
{NSMutableArray * resultArray = [[NSMutableArray alloc]init];for (int i = 0; i < str.length ; i ++){NSRange range = NSMakeRange(i, 1);NSString * singleStr = [str substringWithRange:range];//将分割好的单个字符装进数组[resultArray addObject:singleStr];}return  resultArray;
}

最后验证一下:

NSString * braceStr = @"()[]{([])}";
BOOL braceResult = [self brace_match:braceStr];
/* braceResult为 YES */NSString * braceStr = @"()[]{(";
BOOL braceResult = [self brace_match:braceStr];
/* braceResult为 false */

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里巴巴Java规约p3c-pmd与maven集成,实现maven package打包前校验

前言 网上复制来&#xff0c;复制去&#xff0c;都不知道原因&#xff0c;瞎搞。故写了此篇文档&#xff1b; 以下代码&#xff0c;直接复制到pom.xml中就好使。 需求 阿里巴巴Java规约p3c-pmd与maven集成&#xff0c;实现maven package打包前校验&#xff0c;如果校验不通过…

9. Vue Router4 过渡动效

Vue Router 4 提供了强大的动态过渡动效功能&#xff0c;可以让你的页面在路由切换时有流畅的过渡效果。这主要通过 Vue 的 <transition> 组件实现。 基本使用 首先&#xff0c;我们需要在路由组件外部包裹一个 <transition> 组件。然后&#xff0c;给 <trans…

【Git】从零开始的 Git 基本操作

文章目录 1. 创建 Git 本地仓库2. 配置 Git3. 认识工作区、暂存区、版本库3.1 添加文件 | 场景一3.2 查看 .git 文件3.3 添加文件 | 场景二 4. 修改文件5. 版本回退6. 撤销修改6.1 情况一&#xff1a;对于工作区的代码&#xff0c;还没有 add6.2 情况二&#xff1a;已经 add&am…

实在IDP文档审阅产品导引

实在IDP文档审阅&#xff1a;智能文档处理的革新者 一、引言 在数字化转型的浪潮中&#xff0c;文档处理的智能化成为企业提效的关键。实在智能科技有限公司推出的实在IDP文档审阅&#xff0c;是一款利用AI技术快速理解、处理文档的智能平台&#xff0c;旨在为企业打造专属的…

MyBatis-知识点详解

本文将详细地介绍MyBatis框架&#xff0c;从其优缺点、适用场景到工作原理&#xff0c;全面解析MyBatis的懒加载、延迟加载机制&#xff0c;以及如何管理实体与数据库字段的映射差异。同时&#xff0c;探讨动态SQL、缓存策略、事务处理&#xff0c;并比较MyBatis与Hibernate的不…

Qt 6子窗口全屏显示

一、全屏显示效果 二、全屏相关函数 1,全屏显示函数 QWidget::showFullScreen(); // 此方法只对顶级窗口有效&#xff0c;对子窗口无效 2&#xff0c;恢复显示函数 QWidget::showNormal(); // 此方法也只对顶级窗口有效&#xff0c;对子窗口无效 3&#xff0c;最小化显示函…

go语言并发实战——日志收集系统(五) 基于go-ini包读取日志收集服务的配置文件

实现日志收集服务的客户端 前言 从这篇文章开始我们就正式进入了日志收集系统的编写&#xff0c;后面几篇文章我们将学习到如何编写日志收集服务的客户端,话不多说,让我们进入今天的内容吧&#xff01; 需要实现的功能 我们要收集指定目录下的日志文件&#xff0c;将它们发…

12. MyBatis(二)

源码位置&#xff1a;MyBatis_demo 上篇文章我们学习了MyBatis的定义以及增删查改操作&#xff0c;并且学习了如何在xml文件中编写SQL时使用#{}的方式将参数和对象的属性映射到SQL语句中&#xff0c;上篇的内容已经足以应对大部分场景&#xff0c;本篇文章我们就要学习一下MyBa…

uniapp+vue3监听输入框内容watch

代码 <view class"searchBox"><view class"searchLeft"><wh-icon name"search" size"40"></wh-icon><input type"text" placeholder"请输入搜索内容" v-model"search" /&g…

基础算法---二分查找

文章目录 基本思想1.数的范围2.搜索旋转排序数组3.搜索插入位置4.x的平方根总结 基本思想 二分查找的必要条件并不是单调&#xff0c;而是当我给定一个边界条件&#xff0c;然后左边满足这个边界条件&#xff0c;右边不满足这个边界条件&#xff0c;然后可以查找这个临界点&am…

华火电燃灶:烹饪艺术与科技创新的完美融合

华火电燃灶&#xff0c;以纯净电力激发明火之美&#xff0c;无须燃气&#xff0c;尽释碳负。每一道佳肴背后&#xff0c;都是对安全与健康的无声誓言&#xff0c;为家庭温馨瞬间添上一抹灿烂。从宝贝初声啼哭到晚年宁静美好&#xff0c;华火见证家的每一次幸福团聚&#xff0c;…

DevOps流程的简单总结

DevOps流程图&#xff1a; DevOps流程包含&#xff1a;计划&#xff08;plan&#xff09;、编码(code)、编译(build)、测试(test)、发布(release)、部署(deploy)、运营(operate)、监控&#xff08;monitor&#xff09;&#xff0c;这是一个循环的过程。DevOps是依托容器、自动化…

流程控制:goto语句,模拟switch语句

示例&#xff1a; /*** brief how about goto-switch? show you here.* author wenxuanpei* email 15873152445163.com(query for any question here)*/ #define _CRT_SECURE_NO_WARNINGS//support c-library in Microsoft-Visual-Studio #include <stdio.h>static …

涉密人员离职,如何一键锁定他的电脑屏幕

在任何情况下&#xff0c;保护企业数据的安全性和机密性都是非常重要的。如果涉密人员离职&#xff0c;应该遵循相关的保密协议和规定&#xff0c;确保企业数据的完整性和安全性。同时&#xff0c;也应该对员工进行适当的培训和教育&#xff0c;提高他们的安全意识和技能水平。…

【c++】cpp数学库函数、随机数和时间库函数

&#xff08;1&#xff09;cpp数学库函数 #include <iostream>using namespace std;#include <cmath> //数学函数库的头文件#define pi 3.1415926 //定义一个常量π int main() {cout << "平方数:pow(3, 2) :" << pow(3, 2) << endl;…

开源AI Agent框架的选择

在选择开源AI Agent框架时,首先需要考虑的是框架的开发优先级、功能特性以及社区支持情况。SuperAGI是一个开发者优先的开源自主AI代理框架,它使开发人员能够快速可靠地构建、管理和运行有用的代理12。这表明SuperAGI可能是一个适合需要快速迭代和高度自定义能力的项目的良好…

selenium‘拟人包装‘设置

1、设置header,proxy 1.1关于user-agent 输入about:version 找到user-agent: import requests # 引用requests库 from selenium import webdriver#载入浏览器驱动#header&#xff0c;proxy设置 optionswebdriver.ChromeOptions()#实例化浏览器参数设置options.add_argument…

git基础教程(52).git/config的’remote’和’branch’部分的理解

文章目录 .git/config文件简介‘remote’部分‘branch’部分.git/config文件简介 在使用Git进行版本控制时,每个仓库都会有一个名为.git的隐藏文件夹,其中包含了Git的配置信息和版本记录等重要数据。其中,.git/config文件是每个仓库的配置文件,记录了与远程仓库的连接和本…

水电远程预付费系统:创新与便利的融合

1.系统概述 水电远程预付费系统是一种现代化的管理工具&#xff0c;它通过先进的信息技术实现了水电费用的预先支付和远程管理。这种系统不仅提高了服务效率&#xff0c;也为用户带来了极大的便利&#xff0c;减少了传统抄表和收费过程中的诸多不便。 2.功能特性 2.1实时计量…

pycharm创建的项目

pycharm生成django templates删出 settings.py