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;
}
相关推荐
吃着火锅x唱着歌2 分钟前
LeetCode 1190.反转每对括号间的子串
算法·leetcode·职场和发展
再难也得平4 分钟前
力扣238. 除自身以外数组的乘积(Java解法)
python·算法·leetcode
左手の明天7 分钟前
Linux内核裁剪深入浅出:从原理到实操,打造轻量化嵌入式内核
linux·arm开发·c++
Mikowoo0079 分钟前
CPU_多线程操作图片_代码详解
算法
0 0 09 分钟前
CCF-CSP 38-2 机器人复健指南(jump)【C++】考点:BFS/DFS
开发语言·c++·算法·深度优先·宽度优先
小O的算法实验室10 分钟前
2025年IEEE TSMCS SCI1区TOP,面向异构多点动态聚合的多阶段粒子群算法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
xiaoye-duck11 分钟前
《算法题讲解指南:优选算法-前缀和》--29.和为k的子数组,30.和可被k整除的子数组
c++·算法
Z9fish12 分钟前
sse 哈工大 C 语言编程练习 39
c语言·数据结构·算法
mjhcsp13 分钟前
C++ Dancing Links(舞蹈链):从原理到实战的深度解析
开发语言·c++·dancing links
丶小鱼丶15 分钟前
数据结构和算法之【二分查找】
java·数据结构·算法