带优先级括号匹配

ACWing3703. 括号的匹配

所谓带优先级,就是当出现括号的嵌套时,要求外层括号的优先级大于当前括号的优先级。

其实对于优先级的处理也比较简单,因为我们这里的栈只会存放左括号,那么我们要往栈里面加左括号时,去判断一下栈里面有没有已经存在的左括号,如果有就说明此时存在括号的嵌套,我们就可以判断一下两者的优先级。

cpp 复制代码
#include <iostream>
#include <algorithm>
#include <stack>
#include <cstring>
#include <unordered_map>

using namespace std;


// 大括号 {},中括号 [],小括号 (),尖括号 <>
unordered_map<char, int> p {
    {'{', 3}, {'}', 3},
    {'[', 2}, {']', 2},
    {'(', 1}, {')', 1},
    {'<', 0}, {'>', 0},
};

bool match(char x, char y) {
    return x == '{' && y == '}' || 
        x == '[' && y == ']' || 
        x == '(' && y == ')' || 
        x == '<' && y == '>';
}


bool solve() {
    string s;  cin >> s;
    stack<char> stk; // stk 中只会存在左括号
    for(char x : s) {
        if(x == '{' || x == '[' || x == '(' || x == '<') {
            // 注意这里优先级可以相等
            if(!stk.empty() && p[stk.top()] < p[x]) return false;
            stk.push(x);
        } 
        else {
            if(stk.empty() || !match(stk.top(), x)) return false;
            stk.pop();
        }
    }
    return stk.empty();
}


int main()
{
    int T;
    cin >> T;
    while(T -- ) {
        bool flag = solve();
        cout << (flag ? "YES" : "NO") << endl;
    }
    return 0;
}
相关推荐
迎风打盹儿22 天前
FPGA中if-else和case的理解:综合出来的电路真的会有优先级吗?
fpga·优先级·综合·case·if-else
闲人编程2 个月前
消息队列模式与应用场景
消息队列·异步·优先级·解耦·点对点·延迟·工作队列
老鼠只爱大米2 个月前
LeetCode经典算法面试题 #20:有效的括号(数组模拟法、递归消除法等五种实现方案详细解析)
算法·leetcode··括号匹配·数组模拟法·递归消除法
Channon_3 个月前
专题五:实时系统的生死线——中断安全与优先级管理
嵌入式·优先级·中断安全
汉克老师3 个月前
GESP2025年12月认证C++四级真题与解析(编程题2 (优先购买))
c++·sort·结构体·优先级·gesp4级·gesp四级
序属秋秋秋5 个月前
《Linux系统编程之进程基础》【进程优先级】
linux·运维·c语言·c++·笔记·进程·优先级
加勒比之杰克5 个月前
【操作系统原理】进程优先级与命令行参数、环境变量详解
环境变量·os·优先级
千里马学框架6 个月前
安卓系统中线程优先级Priority查看方式汇总
android·framework·线程·安卓framework开发·优先级·priority
sweetheart7-71 年前
LeetCode20. 有效的括号(2024冬季每日一题 11)
c++·算法·力扣··括号匹配