括号的匹配(中山大学机试题)

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

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

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

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

输入格式

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

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

输出格式

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

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

数据范围

1≤n≤1001≤n≤100
表达式长度不超过 100100。

输入样例:
5
{[(<>)]}
[()]
<>()[]{}
[{}]
{()}
输出样例:
YES
YES
YES
NO
YES
#include<bits/stdc++.h>
using namespace std;
unordered_map<char,int> mp{{'{',1},{'[',2},{'(',3},{'<',4},{'}',5},{']',6},{')',7},{'>',8}};
int n;
int main()
{
    cin>>n;
    while(n--)
    {
        stack<char> st;
        string str;
        cin>>str;
        for(int i=str.length()-1;i>=0;i--)
        {
            if(st.empty()) st.push(str[i]);
            else if(mp[st.top()] > mp[str[i]] && mp[str[i]]>4) break;
            else if( mp[st.top()] - mp[str[i]] ==4) st.pop();
            else st.push(str[i]);

        }
        if(st.empty()) cout<<"YES"<<endl;
        else
        cout<<"NO"<<endl;
    }
    return 0;
}

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
括号匹配是指在一个字符串中,括号必须成对出现,左括号与右括号之间可能会有其他字符,但是左右括号的数量必须相等且匹配。例如,"((()))"、"()()"都是合法的括号匹配,而"((())"、")()("则不是。 基于栈的括号匹配算法的思路如下: 1. 遍历字符串中的每一个字符,如果是左括号('(', '[', '{'),则将其入栈;如果是右括号(')', ']', '}'),则需要判断栈顶元素是否与之匹配。 2. 如果栈顶元素与当前字符匹配,则将栈顶元素出栈,继续遍历下一个字符;否则括号匹配失败,返回false。 3. 如果字符串遍历结束后,栈为空,则括号匹配成功,返回true;否则括号匹配失败,返回false。 下面是使用 Python 实现基于栈的括号匹配算法的代码: ```python def is_valid_parentheses(s: str) -> bool: stack = [] mapping = {')': '(', ']': '[', '}': '{'} for c in s: if c in mapping: if not stack or stack[-1] != mapping[c]: return False stack.pop() else: stack.append(c) return not stack ``` 其中,mapping字典用于记录每个右括号与其对应的左括号。 测试用例可以包括以下几个场景: 1. 空字符串,返回True。 2. 只包含左括号或者右括号的字符串,返回False。 3. 字符串中括号匹配的情况,返回False。 4. 字符串中括号匹配的情况,返回True。 例如: ```python assert is_valid_parentheses("") == True assert is_valid_parentheses("(") == False assert is_valid_parentheses(")") == False assert is_valid_parentheses("()") == True assert is_valid_parentheses("(()") == False assert is_valid_parentheses("()[]{}") == True assert is_valid_parentheses("([)]") == False assert is_valid_parentheses("{[]}") == True ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序garbage

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值