括号匹配(终极版)(典型栈的运用的题目,值得一看)

括号匹配时运用栈的一个典型例子,它是充分利用了栈先进后出的特性,在这之前,我们先来看一个简单的题目

括号匹配1

Description

输入一串带括号的表达式,判断输入的表达式是否合理。即判断括号是否匹配。为了简化题目,只输入左、右括号。如果表达式合理,输出YES,如果不合理,输出NO.

Format

Input

一行只包含左右括号的字符串。

Output

如果表达式合理,输出YES,如果不合理,输出NO.

Samples

Sample Input 1
()(())
Sample Output 1
YES
Sample Input 2
())(
Sample Output 2
NO

 如果你是初学栈,那是不是感觉毫无头绪,完全不知道这和栈有神马关系,没事,我们来慢慢理

有人会直接想直接比较左括号和右括号的数量就可以了,这是明显的错误,我们举个反例:)(

所以这个题的解题思路应该是当出现一个右括号的时候,就用当前最后一个左括号来匹配。如果出现右括号的时候前面没有未匹配的左括号。那么表示输出表达式不合理。

会了吗?我们来把上述的思路转化为专业术语:

首先,建立一个栈,用来存储左括号,而后定义一个临时输入的变量,边输入边判断,遇到违反上述规定的,就直接输出NO,然后return 0,直接结束。

但是这里得注意一个点,就是可能会在匹配结束后还有左括号没有使用,这是后也是不行的,所以要在匹配结束后检查一下栈是不是还有值。

ACcode

#include<bits/stdc++.h>
using namespace std;stack<char> q1,q2;
int main(){char cmp;while (cin>>cmp){if (cmp=='('){q1.push(cmp);}else{if (q1.empty()==0){q1.pop();}else{cout<<"NO";return 0;}}}if (q1.empty()==0){cout<<"NO";}else cout<<"YES";return 0;
}

会了吗?会了的话括号匹配(终极版)你还是做不来

咳咳,所以说我们还要练,再来看看括号匹配2

括号匹配2

题目描述

假设一个表达式由三种括号和四种表达符号组成,现为了简化题目,只输入表达式中的括号。判断括号是否合理。注意:成对的括号内不能有未匹配的括号。暂时不考虑小括号一定要在大括号里面的问题

输入格式

只有三种括号的表达式

输出格式

如果可以匹配输出YES“,如果不可以匹配输出“NO”。

样例 #1

样例输入 #1
([)]{}
样例输出 #1
NO

这道题比括号匹配多了两个条件,那么就特判一下就可以了

因为在成对的括号内不能有未匹配的括号,所以只需用一个栈,然后判断栈顶的括号和输入的括号是不是匹配的就完了

#include<bits/stdc++.h>
using namespace std;stack<int> q;
int main(){char cmp;while (cin>>cmp){if(cmp=='('||cmp=='['||cmp=='{')q.push(cmp);else{
//这个地方必须判断栈是不是空栈,否则会REif (q.empty()==0&&(cmp==q.top()+1||cmp==q.top()+2)){//基于ASCLL码来写,不懂得可以查一下小括号,中括号和大括号的左右括号的关系q.pop();}else {cout<<"NO";return 0;}}        }if (q.empty()==0){cout<<"NO";}else {cout<<"YES";}return 0;
}

现在会了吗,会了的话,我们就可以尝试一下括号匹配终极版了,题是不是还没发出来

题目描述

输入的括号表达式中含有三种括号:(),[],{},判断表达式是否合理。

注意,括号由里到外的顺序只能是小括号,中括号,大括号。但是相同括号可以重叠,比如[[]]是可以的。

输入格式

一个括号表达式

输出格式

输出YES或者NO

样例 #1

样例输入 #1

[{[]}]

样例输出 #1

NO

样例 #2

样例输入 #2

{[]}

样例输出 #2

YES

 这个题比之前还要多了一个条件,就是括号从里到外的顺序只能是小括号,中括号,大括号。这就需要加一个判断等级的变量,因为我们知道,小括号的ASCLL码是小于中括号的。中括号的是小于大括号的,所以就可以基于此来写一个判断等级的变量,只不过需要在每一次输入左括号和匹配成功的时候更新一下就可以了

#include<bits/stdc++.h>
using namespace std;stack<int> q;
char cnt;//判断等级的变量
int main(){char cmp;while (cin>>cmp){if(cmp=='('||cmp=='['||cmp=='{'){q.push(cmp);cnt=cmp;//更新}else{if (q.empty()==0&&(cmp==q.top()+1||cmp==q.top()+2)&&cnt<=cmp){cnt=cmp;//更新q.pop();}else {cout<<"NO";return 0;}}        }if (q.empty()==0){cout<<"NO";}else {cout<<"YES";}return 0;
}

看了这么久,作者也写了这么久,能不能点一个赞,在收藏一下呢?最好的话在点个关注吧

谢谢啦!

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

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

相关文章

代码随想录KamaCoder46. 携带研究材料(第六期模拟笔试)

题目&#xff1a; 代码(首刷看解析 2024年2月22日&#xff09;&#xff1a; #include<vector> #include<iostream> using namespace std; int Pacakge(vector<int>& a,vector<int>& weights, vector<int>& values) {int M a[0];//…

ElasticSearch语法

Elasticsearch 概念 入门学习: Index索引>MySQL 里的表(table)建表、增删改查(查询需要花费的学习时间最多)用客户端去调用 ElasticSearch(3 种)语法:SQL、代码的方法(4 种语法) ES 相比于 MySQL&#xff0c;能够自动帮我们做分词&#xff0c;能够非常高效、灵活地查询内…

【快速上手QT】04-定时器Timer

先来个小示例 我们先简单的来触发一下定时器。 #include "Zhetu.h"#include <qdebug.h>void Zhetu::timerEvent(QTimerEvent* event) { //定时器触发函数qDebug() << "Hello world"; }Zhetu::Zhetu(QWidget *parent): QMainWindow(parent){t…

C#,数值计算,矩阵的乔莱斯基分解(Cholesky decomposition)算法与源代码

一、安德烈路易斯乔尔斯基 安德烈路易斯乔尔斯基出生于法国波尔多以北的查伦特斯海域的蒙古扬。他在波尔多参加了Lyce e&#xff0c;并于1892年11月14日获得学士学位的第一部分&#xff0c;于1893年7月24日获得第二部分。1895年10月15日&#xff0c;乔尔斯基进入莱科尔理工学院…

PhotoSweeper X mac版 v4.8.5 相似重复照片清理工具 兼容 M1/M2

PhotoSweeper X for Mac是一款Mac重复照片/相似照片清理工具&#xff01;PhotoSweeper可以帮你进行&#xff1a;重复相似照片/数码相片查找、对比和删除&#xff0c;轻松清理Mac上的重复图片&#xff0c;非常实用。 应用介绍 PhotoSweeper X for Mac是一款Mac重复照片/相似照片…

实战打靶集锦-025-HackInOS

文章目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查5. 提权5.1 枚举系统信息5.2 探索一下passwd5.3 枚举可执行文件5.4 查看capabilities位5.5 目录探索5.6 枚举定时任务5.7 Linpeas提权 靶机地址&#xff1a;https://download.vulnhub.com/hackinos/HackInOS.ova 1. 主机…

【图片公式识别】图片公式转Word与LaTeX文档:智能识别与转换

前言 嘿&#xff0c;大家好呀&#xff01;&#x1f44b; 谁都知道&#xff0c;写 Word 文档里的公式可不是一件简单的事情&#xff01;你辛辛苦苦在键盘上敲出的数学公式&#xff0c;结果随着 Word 版本的更新&#xff0c;竟然变成了一张图片&#xff01;&#x1f624; 这简直就…

板块一 Servlet编程:第八节 文件上传下载操作 来自【汤米尼克的JavaEE全套教程专栏】

板块一 Servlet编程&#xff1a;第八节 文件的上传下载操作 一、文件上传&#xff08;1&#xff09;前端内容&#xff08;2&#xff09;后端内容 二、文件下载&#xff08;1&#xff09;前端的超链接下载&#xff08;2&#xff09;后端下载 在之前的内容中我们终于结束了Servle…

qtday2作业

思维导图 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;…

Linux搭建FISCO BCOS的第一个区块链网络

一、前言 FISCO BCOS是由金融区块链合作联盟&#xff08;深圳&#xff09;与微众银行共同发起的开源区块链项目&#xff0c;支持多链多账本&#xff0c;满足金融行业复杂业务需求。本文将介绍如何在Ubuntu操作系统上使用Linux命令搭建FISCO BCOS的第一个区块链网络。 目录 一…

K8S部署Java项目(Springboot项目)pod状态:CrashLoopBackOff

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

昇腾ACL应用开发之模型转换ATC

一.前提条件 在前面的章节中我们已经安装了包含模型转换的套件包CANN-TOOLKIT&#xff0c;默认的安装路径会在/usr/local/Ascend里面&#xff0c;我们将该套件所需要的东西加入到环境变量中以便我们调用&#xff1a; 将source /usr/local/Ascend/ascend-toolkit/set_env.sh加入…

人为物累,心为形役

一、人是什么 你是你&#xff0c;他是他&#xff0c;我是我&#xff0c;有什么区别吗&#xff0c;直到自我发现我与你不同时&#xff0c;不同是什么&#xff0c;身体结构&#xff1f;人生经历&#xff1f;所拥有的一切&#xff1f;暂时搁置这些的话&#xff0c;抽离我们的意识…

[ai笔记11] 论ai韭菜的自我修养

欢迎来到文思源想的ai空间&#xff0c;这是技术老兵学习ai以及观点分享的第11篇内容&#xff01; 上班之后时间确实少了许多&#xff0c;但是最近也没闲着&#xff0c;关于ai的学习一直在探索两个部分&#xff0c;一个是看那本有名的书《这就是ChatGPT》&#xff0c;另外一个则…

Gmail邮箱群发邮件的技巧?邮箱怎么绑定?

Gmail邮箱注册教程指南&#xff1f;如何注册新的Gmail邮箱帐户&#xff1f; Gmail邮箱作为谷歌推出的邮件服务&#xff0c;以其高效、稳定和便捷的特性受到广大用户的喜爱。然而&#xff0c;如何在Gmail中进行有效的群发邮件&#xff0c;接下来&#xff0c;蜂邮将给大家介绍一…

odoo16-API(Controller)带有验证访问的接口

odoo16-API&#xff08;Controller&#xff09;带有验证访问的接口 目前我使用odoo原生的登录token来验证登陆的有效性 废话不多说直接上代码 # 测试获取session_id import requests class GetOdooData(http.Controller):def getOdooToken(self):# http://localhost:8123访问…

【深入理解设计模式】 工厂设计模式

工厂设计模式 工厂设计模式是一种创建型设计模式&#xff0c;它提供了一种在不指定具体类的情况下创建对象的接口。在工厂设计模式中&#xff0c;我们定义一个创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 工厂设计模式的目…

part2 思维导图(微分部分)

1. 导数和微分 2. 一元微分学 2.1 四则运算 2.2 口诀 2.3 导数计算 2.3.1 计算1 2.3.1 计算2

win32汇编定时器继续学习2

前面学习了win32汇编定时器&#xff0c;还非常不熟悉&#xff0c;继续熟悉&#xff0c;稍微增加一点功能&#xff1b; .386.model flat,stdcalloption casemap:noneinclude windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32…