• 【题解】大中小括号匹配


    题目描述

    假设表达式中允许四种括号:<>、()、[]、{},它们的优先次序是由小到大的。其嵌套必须满足优先次序由大到小,例如:[()]或者{}或(())等都为正确的匹配。形如:([])或([)]均为错误的匹配。

    编写程序判断所给的括号串是否匹配。若匹配,则输出“YES”,否则输出“NO”。

    输入输出格式

    输入格式:

    第一行有一个数值N,它的范围是 [1...100]。

    接下来有N行字符串,它是由小写字母,运算符和左右小圆括号构成,字符串长度小于255。

    输出格式:

    N行,输出对应行的应表达式括号是否匹配。

    输入输出样例

    输入样例:
    5
    {}{}<><>()()[][]
    {{}}{{}}<<>><<>>(())(())[[]][[]]
    {{}}{{}}<<>><<>>(())(())[[]][[]]
    {<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
    ><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
    输出样例:
    YES
    YES
    YES
    YES
    NO
    这道题可以用栈来做,先把每个括号的优先级用数字放入栈中,一边放一边判断是否匹配,如果进入的括号的优先级大于原来栈中括号的优先级,就说明不匹配,如果括号匹配,就清除原来栈的顶部
    具体程序如下:
    #include<iostream>
    #include<stack>
    #include<cstdio>
    #include<string>
    using namespace std;
    string str;
    int n,v,now;
    stack<int>s;
    int main()
    {
        scanf("%d",&n);
        char ch=cin.get();
        for(register int i=1;i<=n;++i)
        {
            v=0;
            getline(cin,str);
            for(register int j=0;j<str.size();++j)
            {
                now=0;
                if(str[j]=='<') now=1;
                if(str[j]=='>') now=11;
                if(str[j]=='(') now=2;
                if(str[j]==')') now=12;
                if(str[j]=='[') now=3;
                if(str[j]==']') now=13;
                if(str[j]=='{') now=4;
                if(str[j]=='}') now=14;
                if(s.empty()&&now<10)
                {
                    s.push(now);
                    continue;
                }
                else if(now>10&&s.empty())
                {
                    printf("NO
    ");
                    v=1;
                    break;
                }
                else if(now-10==s.top())
                {
                    s.pop();
                }
                else if(now>s.top())
                {
                    printf("NO
    ");
                    v=1;
                    break;
                }
                else s.push(now);
            }
            if(v==1)
            {
                while(!s.empty()) s.pop();
                continue;
            }
            if(s.empty()) printf("YES
    ");
            else
            {
                printf("NO
    ");
            }
            while(!s.empty()) s.pop();
        }
        
    }
    
    
  • 相关阅读:
    Exadata 上关于SAS盘的小秘密
    Python 全栈开发:python循环语句while
    Python 全栈开发:python条件语句if..else..
    Python 全栈开发:python基础
    Python 全栈开发:python初识
    计算机基础(简单了解)
    如何计算网络配置中广播域和冲突域的数目?
    使VS开发的程序在Win7系统运行时自动提升权限
    在程序中通过Process启动外部exe的方法及注意事项
    获取指定目录下多种格式的文件
  • 原文地址:https://www.cnblogs.com/2021-yanghaoran/p/10482913.html
Copyright © 2020-2023  润新知