3703. 括号的匹配 北京师范大学考研上机真题 栈的思想

在算术表达式中,除了加、减、乘、除等运算外,往往还有括号。

包括有大括号 {},中括号 [],小括号 (),尖括号 <> 等。

对于每一对括号,必须先左边括号,然后右边括号;如果有多个括号,则每种类型的左括号和右括号的个数必须相等;对于多重括号的情形,按运算规则,从外到内的括号嵌套顺序为:大括号->中括号->小括号->尖括号,另外相同的括号可以嵌套。

例如,{[()]},{(())},{``{}} 为一个合法的表达式,而 ([{}]),{([])},[{<>}] 都是非法的。

输入格式

第一行包含整数 n,表示共有 n个表达式需要判断。

接下来 n 行,每行包含一个括号表达式。

输出格式

每行输出一个表达式的判断结果。

如果合法输出 YES,否则输出 NO

数据范围

1≤n≤100

表达式长度不超过 100100。

输入样例:
复制代码
5
{[(<>)]}
[()]
<>()[]{}
[{}]
{()}
输出样例:

解释

复制代码
YES
YES
YES
NO
YES
cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

unordered_map<char, int> mp{{'{',1},{'[',2},{'(',3},{'<',4},{'}',5},{']',6},{')',7},{'>',8}};

char g[110];

int main()
{
    int n;
    cin >> n;

    while(n --)
    {
        memset(g, 0, sizeof g);
        cin >> g;
        int len = strlen(g);
        stack<char> stack;
        for (int i = len - 1; i >= 0; i --)
        {
            if(stack.empty())  stack.push(g[i]);
            else if(mp[stack.top()] > mp[g[i]] && mp[g[i]] > 4) break;  
            else if(mp[stack.top()] - mp[g[i]] == 4 ) stack.pop();
            else stack.push(g[i]);
        }
        if(stack.empty()) puts("YES");
        else puts("NO");
    }
    return 0;
}
相关推荐
青瓦梦滋5 小时前
C++的IO流与STL的空间配置器
开发语言·c++
鱼很腾apoc7 小时前
【学习篇】第20期 超详解 C++ 多态:从语法规则到底层原理
java·c语言·开发语言·c++·学习·算法·青少年编程
不吃土豆的马铃薯8 小时前
4.SGI STL 二级空间配置器 allocate 与_S_refill 源码解析
c语言·开发语言·c++·dreamweaver·内存池
小许同学记录成长8 小时前
三维重建技术文档
算法·无人机
fufu03118 小时前
vscode配置C/C++环境,用GDB调试简单程序分享
开发语言·c++
水云桐程序员10 小时前
C++变量的概念及用法
开发语言·c++
小O的算法实验室10 小时前
2026年ASOC,基于多目标优化去噪双存档进化算法+路径规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
水饺编程10 小时前
第5章,[Win32 章节] :几种典型的颜色
c语言·c++·windows·visual studio
2601_9545267510 小时前
逆向解析Temu底层动销算法:基于API高并发轮询与全域存量透视的自动化架构重构
算法·架构·自动化